我正在使用
CodeDomProvider
类在运行时编译类。这对于仅使用 System
命名空间的类来说效果很好:
using System;
public class Test
{
public String HelloWorld()
{
return "Hello World!";
}
}
如果我尝试使用
System.Web.UI.WebControls
编译一个类,我会收到此错误:
{错误CS0006:找不到元数据文件“System.Web.UI.WebControls”} System.CodeDom.Compiler.CompilerError
这是我的代码片段:
var cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.Web.UI.WebControls");
如何引用
System.Web.UI.WebControls
命名空间?
您可以循环浏览所有当前加载的程序集:
var assemblies = AppDomain.CurrentDomain
.GetAssemblies()
.Where(a => !a.IsDynamic)
.Select(a => a.Location);
cp.ReferencedAssemblies.AddRange(assemblies.ToArray());
您引用程序集,而不是命名空间。您应该使用 MSDN 查找包含您需要使用的类的程序集的名称:在本例中它将是:
var cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.Web.dll");
在我的例子中,事实证明这并没有那么暴力。我正在构建一个插件,当前域中加载了 730 个程序集,因此存在很大的滞后。
var assemblies = someType.Assembly.GetReferencedAssemblies().ToList();
var assemblyLocations =
assemblies.Select(a =>
Assembly.ReflectionOnlyLoad(a.FullName).Location).ToList();
assemblyLocations.Add(someType.Assembly.Location);
cp.ReferencedAssemblies.AddRange(assemblyLocations.ToArray());