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ます。これらの標準ライブラリはクラッシュしないため、コード自体は一般的に問題ないことは明らかです。

失敗しているマシンに Entity フレームワークがインストールされていないことはかなり明らかです。.NET ネイティブ フレームワークの一部ではないため、これは理にかなっています。アドオンです。

于 2012-11-05T15:57:07.333 に答える