0

我的问题是这样的:

有一个项目叫myframework. 它在其中定义了一些扩展方法,如下所示:

namespace myframework
{
    public static class Helpers
    {
        public static bool ContainsAll(this string obj, string[])
        {
            return true;
        }
    }
}

它还有一些其他的东西,比如接口等等。

我通过 System.CodeDom 类生成了第二个类。生成的输出有点像这样:

using myframework;


public class A: IMyFrameworkInterface

{
    public void foo()
    {
        string s ="HELLO";

        if(s.ContainsAll(some_arr))
            return;
    }
        //More methods defined...

}

我传递的编译器选项是在实际编译调用之前创建的,它引用了正确的程序集

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

代码编译模块写在不同的项目中。负责这个的特定类也很好地使我们能够访问 CompilerError 对象的列表,通过它我们可以了解编译的结果。

问题1:当我在 asp.net 项目中尝试此操作时,编译器抛出错误说它找不到元数据文件 myframework.dll(尽管它在项目中被引用)。

问题 2:当我尝试使用 Windows 窗体项目时。它给出了一个不同的错误。这次说字符串不包含 ContainsAll() 的定义

如何解决这两个具体问题?

4

1 回答 1

1

经过一番挖掘,找到了这个问题的答案。我使用的是 .net 框架 3.5。codedom 编译器 apis 默认以框架的 v2.0 为目标。因此,您必须手动指定正确的框架:

var cp = new CompilerParameters(
    new Dictionary<string,string>() { {"CompilerVersion", "v3.5"} });

要在 asp.net 环境中进行编译,您必须实际将引用指向正确的位置。因此,您必须执行以下操作:

cp.ReferencedAssemblies.Add(
    HttpContext.Current.Server.MapPath(
        "bin\\myframework.dll"));

我的参考资料:

  1. http://blogs.msdn.com/b/lukeh/archive/2007/07/11/c-3-0-and-codedom.aspx
  2. .Net 3.5 CodeDom 编译器生成奇怪的错误
  3. 以及问题帖子中的评论。:)
于 2013-05-31T03:50:18.127 回答