我的问题是这样的:
有一个名为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()
的定义如何解决这两个具体问题?
答案 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"));
我的推荐信: