CompilerParameters.ReferencedAssemblies - 添加对System.Web.UI.WebControls的引用

cll*_*pse 9 c# compiler-construction assemblies

我正在使用CodeDomProvider该类在运行时编译类.这适用于仅使用System命名空间的类:

using System;

public class Test
{
    public String HelloWorld()
    {
        return "Hello World!";
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用System.Web.UI.WebControls虽然编译一个类,我得到这个错误:

{error CS0006:无法找到元数据文件'System.Web.UI.WebControls'} System.CodeDom.Compiler.CompilerError

这是我的代码片段:

var cp = new CompilerParameters();

cp.ReferencedAssemblies.Add("System.Web.UI.WebControls");
Run Code Online (Sandbox Code Playgroud)

如何引用System.Web.UI.WebControls命名空间?

Dan*_*fer 40

您可以遍历所有当前加载的程序集:

var assemblies = AppDomain.CurrentDomain
                            .GetAssemblies()
                            .Where(a => !a.IsDynamic)
                            .Select(a => a.Location);   

cp.ReferencedAssemblies.AddRange(assemblies.ToArray());
Run Code Online (Sandbox Code Playgroud)

  • 请注意,它的AddRange不是Add(会修复但不能进行<6 char编辑). (3认同)

Tim*_*son 15

您引用程序集,而不是名称空间.您应该使用MSDN查找包含您需要使用的类的程序集的名称:在这种情况下,它将是:

var cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.Web.dll");
Run Code Online (Sandbox Code Playgroud)

  • 啊,System.Web.UI.WebControls.dll不存在 - 该命名空间中的类居住在System.Web.dll中. (3认同)

jwi*_*ize 6

在我的案例中,这被证明是一种不那么强暴的力量.我正在构建一个插件,当前域中加载了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());
Run Code Online (Sandbox Code Playgroud)