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本機框架的一部分。這是一個附加組件。