У меня возникла проблема при компиляции текста в динамические объекты во время выполнения.C# Загрузка сборок динамически
Я написал простой кусок кода, чтобы составить текст:
public class CompileFactory
{
public dynamic Compile(String classCode, String mainClass, Object[] requiredAssemblies)
{
CSharpCodeProvider provider = new CSharpCodeProvider(new Dictionary<string, string>
{
{ "CompilerVersion", "v4.0" }
});
CompilerParameters parameters = new CompilerParameters
{
GenerateExecutable = true, // Create a dll
GenerateInMemory = true, // Create it in memory
WarningLevel = 3, // Default warning level
CompilerOptions = "/optimize", // Optimize code
TreatWarningsAsErrors = false // Better be false to avoid break in warnings
};
// Add all extra assemblies required
foreach (var extraAsm in requiredAssemblies)
{
parameters.ReferencedAssemblies.Add(extraAsm as string);
}
CompilerResults results = provider.CompileAssemblyFromSource(parameters, classCode);
if (results.Errors.Count != 0)
{
return "FAILED";
}
return results.CompiledAssembly.CreateInstance(mainClass); ;
}
}
Это, как я использую метод Compile
.
List<string> assemblies = new List<string>{"System.Net.Mail.dll", "System.Net.dll"};
dynamic obj = compile.Compile(fileText, pluginName, assemblies.ToArray());
Как вы можете видеть, я добавляю ссылки на дополнительные сборки в какой-то момент. По какой-то причине, когда я добавляю using System.Net;
в текстовый файл, он не будет ссылаться и я получаю ошибки. Текст, который я компилирую, буквально является файлом .cs, сохраненным как текст. Я думал об этом, извлекая using *
и добавляя их отдельно, однако при добавлении System.Net.Mail.dll
файл метаданных не найден.
Кто-нибудь испытал что-то подобное? Я действительно хотел бы добавить файл using *
в файл и быть готовым к нему. Любой вход был бы оценен.
Можете ли вы показать, как вы называете 'Compile'? Я хотел бы видеть аргументы, которые вы передаете –
@ PhilippeParé 'dynamic obj = compile.Compile (fileText, pluginName, assemblylies.ToArray());' Assemblies - это просто 'List {" System.Net.Mail.dll " , «System.Net.dll»}; ' –
Вы должны добавить это в свой пост, потому что это очень важно для вашей проблемы, см. Мой ответ ниже –