2

我正在使用 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);
}

关于为什么会发生这种情况的任何想法?

4

2 回答 2

3

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

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

于 2012-11-05T15:55:43.200 回答
1

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

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

于 2012-11-05T15:57:07.333 回答