我在运行时将文本编译为动态对象时遇到问题。
我编写了一段简单的代码来编译文本:
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 *
添加到文件中并准备好它。
任何意见都将不胜感激。
答案 0 :(得分:2)
这里的问题是System.Net.dll
不存在。您可以通过右键单击引用的某个位置来检查.Net类型是哪个程序集,然后选择&#34;转到定义&#34;。这将打开一个带有类定义的选项卡&#34;来自元数据&#34;。在此文件的顶部,您有#region
显示此类型的来源。对于TcpClient
,我们可以看到:
#region Assembly System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\System.dll
#endregion
使用&#34; System.dll&#34;将您的通话更改为Compile
而不是&#34; System.Net.dll&#34;它应该工作得很好
编辑/澄清:无法从using
语句中获取程序集名称。