【问题标题】:CompilerParameters.ReferencedAssemblies -- Add reference to System.Web.UI.WebControlsCompilerParameters.ReferencedAssemblies -- 添加对 System.Web.UI.WebControls 的引用
【发布时间】:2009-04-27 13:58:28
【问题描述】:

我正在使用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

这是我的代码的 sn-p:

var cp = new CompilerParameters();

cp.ReferencedAssemblies.Add("System.Web.UI.WebControls");

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

【问题讨论】:

    标签: c# compiler-construction assemblies


    【解决方案1】:

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

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

    【讨论】:

    • 为什么在 .Where(a => !a.IsDynamic ) 能做到的时候捕获 try/catch?
    • 我的原始答案适用于 .net 2.0,这是我在编写代码时使用的。 .net 2.0 中既不存在 LINQ 也不存在 Assembly.IsDynamic 属性。
    • 请注意,它是 AddRange 而不是 Add(可以修复但不能进行
    【解决方案2】:

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

    var cp = new CompilerParameters();
    cp.ReferencedAssemblies.Add("System.Web.dll");
    

    【讨论】:

    • 对我不起作用。您认为我应该提供程序集的完整路径吗?如是;我该如何动态地做到这一点?
    • 啊,System.Web.UI.WebControls.dll 不存在——该命名空间中的类存在于 System.Web.dll 中。
    【解决方案3】:

    在我的情况下,这被证明是不那么暴力的。我正在构建一个插件,当前域中加载了 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());
    

    【讨论】:

    • +1。我使用了你的建议,效果很好。只需要编辑最后一行,改写cp.ReferencedAssemblies.AddRange(assemblyLocations.ToArray());
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2017-03-28
    • 1970-01-01
    • 2014-02-08
    • 2015-02-04
    相关资源
    最近更新 更多