Как добавить другой проект (сборку) из моего решения в набор CompilerParameters.ReferencedAssemblies?
Скажем, у меня есть строка кода ниже, которую я компилирую в своем основном проекте. Но я хочу реализовать интерфейс в CustomClass. Интерфейс находится в другом проекте в моем решении (часть ссылок в моем основном проекте), когда я делаю это
открытый класс CustomClass: InterfaceType
Я получаю ошибку, как это. Как я могу ссылаться на другой проект, чтобы я мог использовать интерфейс и другие классы, которые являются его частью, в моем динамическом коде?
c: \ Users \ xxx \ AppData \ Local \ Temp \ m8ed4ow-.0.cs (1,32: ошибка CS0246: не удалось найти тип или имя пространства имен InterfaceType (отсутствует директива using или ссылка на сборку?)
string code2 =
" public class CustomClass : InterfaceType " +
" {" +
" }";
// Compiler and CompilerParameters
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
CompilerParameters compParameters = new CompilerParameters();
compParameters.GenerateInMemory = false; //default
//compParameters.TempFiles = new TempFileCollection(Environment.GetEnvironmentVariable("TEMP"), true);
compParameters.IncludeDebugInformation = true;
//compParameters.TempFiles.KeepFiles = true;
compParameters.ReferencedAssemblies.Add("System.dll");
CodeDomProvider compiler = CSharpCodeProvider.CreateProvider("CSharp");
// Compile the code
CompilerResults res = codeProvider.CompileAssemblyFromSource(compParameters, code2);
// Check the compiler results for errors
StringWriter sw = new StringWriter();
foreach (CompilerError ce in res.Errors)
{
if (ce.IsWarning) continue;
sw.WriteLine("{0}({1},{2}: error {3}: {4}", ce.FileName, ce.Line, ce.Column, ce.ErrorNumber, ce.ErrorText);
}
string error = sw.ToString();
sw.Close();
// Create a new instance of the class 'CustomClass'
object myClass = res.CompiledAssembly.CreateInstance("CustomClass");
1 ответ
Суть в том, что вам нужно добавить другой проект в вашу коллекцию CompilerParameters.ReferencedAssemblies. Это может быть сложно, потому что CodeDOM должен иметь возможность добраться до сборки, и, таким образом, сборка либо должна находиться в GAC, либо вам необходимо добавить полный путь к сборке в расположение ReferencedAssemblies.
Один простой способ сделать это, если вы ссылаетесь на проект, который содержит "InterfaceType" в проекте, который выполняет компилятор CodeDOM, это сделать что-то вроде этого: compilerParameters.ReferencedAssemblies.Add(typeof(InterfaceType).Assembly.Location);
, Если нет, вам придется найти какой-то другой метод, чтобы убедиться, что CodeDOM может найти сборку, на которую вы хотите сослаться.