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

问题描述 投票:0回答:3

我正在使用

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
命名空间?

c# assemblies system-codedom-compiler
3个回答
44
投票

您可以循环浏览所有当前加载的程序集:

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

cp.ReferencedAssemblies.AddRange(assemblies.ToArray());

16
投票

您引用程序集,而不是命名空间。您应该使用 MSDN 查找包含您需要使用的类的程序集的名称:在本例中它将是:

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

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());
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.