2

我在运行时使用CSharpCodeProvider编译DLL。我的代码运行在某些机器上正常,但在otherse失败,出现以下错误:CSharpProvider运行时编译无法找到DLL

error CS0006: Metadata file 'EntityFramework.dll' could not be found

下面的代码片段:

var csFile = ... // the file is in C:\Program Data\MyFolder\InnerFolder 
using (var provider = new CSharpCodeProvider()) 
{ 
    var parameters = new CompilerParameters 
    { 
     GenerateInMemory = false, // we want the dll saved to disk 
     GenerateExecutable = false, 
     CompilerOptions = "/target:library", 

     // the assembly is compiled to the same directory as the .cs file 
     OutputAssembly = GetNewCacheAssemblyPath(), 
    }; 

    parameters.ReferencedAssemblies.AddRange(new[] 
     { 
      "System.dll", 
      "System.Data.dll", 
      "System.Data.Entity.dll", 
      "EntityFramework.dll", 
     }); 

    var compilerResult = provider.CompileAssemblyFromFile(parameters, csFile); 
} 

任何想法,为什么这可能发生?

+0

做的所有机器都安装了Entity框架吗?如果没有,你可能需要在其上安装.Net framework 4或手动部署它 – Amitd

+0

@Amitd:什么是最简单的方法来确定是否是这种情况?据我所知,所有这些机器都安装了.NET 4。这些是开发者机器,我们的应用程序(它使用EF正在开发中......) – ChaseMedallion

+0

for EF更多信息在这个页面上http://stackoverflow.com/questions/6498388/could-not-locate-assembly-entityframework。 。可能是有版本差异..没有线索..也尝试复制输出文件夹中的dll像汉斯说 – Amitd

回答

3

EntityFramework不是.NET框架的一部分。所以一个简单的解释是,这台机器无法安装。你应该自己部署它。当你使用Nuget包时,你将在你的bin \ Release目录中拥有一个DLL副本。不要忘记将其包含在运输二进制文件中。

下一个失败模式是你确实部署它,但该程序的工作目录不是你希望它的地方。提供程序集的完整路径名称以避免这种情况。您可以使用Assembly.GetEntryAssembly()。位置来查找EXE的路径。

+1

工作目录竟然是一个问题。我使用反射来查找当前应用程序使用的EF DLL的路径,然后使用“/ lib”编译器选项指定路径。 – ChaseMedallion

1

你提到的代码工作的一些但不是别人,它清楚地加载所有标准System文件正确,因为它们是EntityFramework.dll之前测序,很显然你的代码本身一般是可以的,因为这些标准库没有崩溃。

它似乎相当清楚地表明它失败的机器没有安装实体框架 - 这很有意义,因为它不是.NET本机框架的一部分。这是一个附加组件。