CSharpProvider运行时编译无法找到DLL

时间:2012-11-05 15:50:17

标签: c# entity-framework exception-handling assembly-references csharpcodeprovider

我正在使用CSharpCodeProvider在运行时编译DLL。我的代码在某些机器上运行正常,但在其他机器上它失败并出现以下错误:

  

错误CS0006:找不到元数据文件'EntityFramework.dll'

以下是代码段:

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);
}

有关为何会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:3)

EntityFramework不是.NET框架的一部分。所以一个简单的解释是,这个失败的机器没有安装它。你应该自己部署它。当您使用Nuget包时,您将在bin \ Release目录中获得DLL的副本。不要忘记将其与您的送货二进制文件一起包含。

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

答案 1 :(得分:1)

你提到代码适用于某些代码但不适用于其他代码,它显然正确地加载了所有标准System文件,因为它们在EntityFramework.dll之前排序,并且很清楚你的代码本身通常是正常的,因为这些标准库没有崩溃。

似乎相当清楚的是,它失败的机器没有安装Entity框架 - 这是有道理的,因为它不是.NET本机框架的一部分。这是一个附加组件。