由于某些引用程序集goofup,无法编译代码输出

时间:2013-05-24 13:12:41

标签: c# asp.net compiler-errors codedom

我的问题是这样的:

有一个名为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()

的定义

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

1 个答案:

答案 0 :(得分:1)

经过一番挖掘后找到答案。我使用的是.net framework 3.5。 codom编译器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 Compiler generating odd errors
  3. 并在问题的帖子中发表评论。 :)