我正在使用CodeDomProvider在内存中编译一些C#代码,然后执行代码。当我在控制台应用程序中运行代码时,一切正常。它编译,我可以执行它并获得结果。
但是,当我尝试在Web应用程序中运行它时,这个完全相同的代码失败了。我得到一个BadImageFormatException,内部异常是Bad IL Format。
我不知道Web应用程序与控制台应用程序有一些限制吗?
感谢您的任何建议。
我正在运行.NET 4.0。
编辑:我注意到一切都有效,直到我从项目中添加对另一个程序集的引用。所以我有一个包含项目引用的类库,其中包含我的实体模型。我正在添加它作为参考,如:
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cp = new CompilerParameters();
cp.GenerateInMemory = true;
cp.ReferencedAssemblies.Add("mscorlib.dll");
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("System.Core.dll");
cp.ReferencedAssemblies.Add("System.Data.Linq.dll");
cp.ReferencedAssemblies.Add("System.Data.Entity.dll");
cp.ReferencedAssemblies.Add("MyApp.Data.dll");
var results = provider.CompileAssemblyFromSource(cp, source);
var assm = results.CompiledAssembly;
如果我只是让我的类有一个返回字符串的方法并删除对MyApp.Data.dll的添加引用,那么一切正常。只要我在其中添加该引用失败。
有什么想法吗?
答案 0 :(得分:0)
我几乎在去年完成的每个项目中都是通过网络应用程序动态创建代码,所以它绝对可行/实用。
安全性可能会有所不同,但您会收到权限异常,可能不是BadImageFormatException
。
另一个区别是控制台应用的默认构建配置文件是x86 4.0 Client Profile
,而网络应用的默认值是Any CPU, 4.0.
您可能想发布实际代码;有人可能会发现问题。
答案 1 :(得分:0)
由于添加引用的程序集失败了,我做了一些Binging并遇到了this discussion。基本上这是一个需要使用Server.MapPath的问题,以便代码可以找到dll。
cp.ReferencedAssemblies.Add(HttpContext.Current.Server.MapPath("bin\\MyApp.Data.dll"));
现在它有效!所以这是一个简单的错误。 :)