Как добавить другой проект (сборку) из моего решения в набор 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 может найти сборку, на которую вы хотите сослаться.

Другие вопросы по тегам