C# CSharpProvider运行时编译找不到DLL
我正在使用CSharpCodeProvider在运行时编译DLL。我的代码在某些计算机上运行正常,但在其他计算机上运行失败,出现以下错误: 错误CS0006:找不到元数据文件“EntityFramework.dll” 以下是一段代码片段:C# CSharpProvider运行时编译找不到DLL,c#,entity-framework,exception-handling,assembly-references,csharpcodeprovider,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
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);
}
有没有想过为什么会发生这种情况?EntityFramework不是.NET framework的一部分。因此,一个简单的解释是,这台发生故障的机器没有安装它。你应该自己部署它。当您使用Nuget包时,您将在bin\Release目录中拥有DLL的副本。别忘了将其与您的传送二进制文件一起包含
下一个失败模式是您确实部署了它,但程序的工作目录不是您希望的位置。提供程序集的完整路径名以避免此问题。例如,您可以使用Assembly.GetEntryAssembly().Location来查找EXE的路径。EntityFramework不是.NET framework的一部分。因此,一个简单的解释是,这台发生故障的机器没有安装它。你应该自己部署它。当您使用Nuget包时,您将在bin\Release目录中拥有DLL的副本。别忘了将其与您的传送二进制文件一起包含
下一个失败模式是您确实部署了它,但程序的工作目录不是您希望的位置。提供程序集的完整路径名以避免此问题。例如,您可以使用Assembly.GetEntryAssembly().Location来查找EXE的路径。您提到的代码在某些文件上有效,但在其他文件上无效,它清楚地正确加载所有标准
系统
文件,因为它们在EntityFramework.dll
之前排序,很明显,您的代码本身通常是正常的,因为这些标准库没有崩溃
很明显,它正在失败的机器没有安装实体框架,这是有道理的,因为它不是.NET本机框架的一部分。它是一个附加组件。您提到的代码在某些系统上有效,但在其他系统上无效,它显然正确加载了所有标准的
系统
文件,因为它们在EntityFramework.dll
之前排序,而且很明显,您的代码本身通常是正常的,因为这些标准库没有崩溃
很明显,它正在失败的机器没有安装实体框架,这是有道理的,因为它不是.NET本机框架的一部分。它是一个附加组件。所有机器都安装了Entity framework吗?如果没有,您可能需要在其上安装或部署.Net framework 4manually@Amitd:确定情况是否如此的最简单方法是什么?据我所知,所有这些机器都安装了.NET4。这些是开发人员机器,我们的应用程序(正在开发中使用EF…)在此页面上获取EF更多信息。。可能有版本差异。。没有线索。。还可以尝试复制输出文件夹中的DLL,如Hans saiddo所有机器都安装了Entity framework吗?如果没有,您可能需要在其上安装或部署.Net framework 4manually@Amitd:确定情况是否如此的最简单方法是什么?据我所知,所有这些机器都安装了.NET4。这些是开发人员机器,我们的应用程序(正在开发中使用EF…)在此页面上获取EF更多信息。。可能有版本差异。。没有线索。。也可以尝试复制输出文件夹中的DLL,如Hans所说,工作目录出现问题。我使用反射查找当前应用程序使用的EF DLL的路径,然后使用“/lib”编译器选项指定路径。工作目录出现问题。我使用反射查找当前应用程序使用的EF DLL的路径,然后使用“/lib”编译器选项指定路径。