【发布时间】:2016-10-24 09:08:11
【问题描述】:
在运行时将文本编译为动态对象时遇到问题。
我写了一段简单的代码来编译文本:
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, assemblies.ToArray());Assemblies 只是一个List<string>{"System.Net.Mail.dll", "System.Net.dll"}; -
您应该将此添加到您的帖子中,因为它与您的问题非常相关,请参阅下面的回答
标签: c# .net dynamic namespaces using