5

重複の可能性:
x86 または x64 アセンブリの読み込み

Any CPU .NET プロジェクトをコンパイルしようとしていますが、x86 および x64 プラットフォーム用に異なるバージョンを持つ SQLite ライブラリをリンクする必要があります。DLL のバージョンだけを x64 に変更しても解決せず、アプリケーションが起動しません。x64 参照を使用してコードを再コンパイルする必要があります。x86 と x64 の両方の参照を追加すると、競合が原因でコンパイルに失敗します。使用しているシステム COM ライブラリの 1 つが WOW64 で動作しないため、x86 を使用してアプリケーションをコンパイルできません。

All 32-bit VSS applications (requesters, providers, and writers) must run as native 32-bit or 64-bit applications. Running them under WOW64 is not supported

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/eadf5dcd-fbd1-4224-9a56-b5843efebb15/

そのため、任意の CPU プロジェクトをビルドする必要がありますが、現時点でこの問題を解決するには、x86 と x64 のプロジェクトを重複させるしかありません。もっと良いものはありますか?

アップデート

プロジェクトで x64 ライブラリを参照し、x86 ライブラリをロードしようとすると、次の例外が発生します。

The located assembly's manifest definition does not match the assembly reference.

4

1 に答える 1

6

主な問題は、x86とx64で異なるバージョンのSQLiteを使用していたという事実でした。メソッドを追加しました

static private Assembly SQLitePlatformSpecificResolve(object sender, ResolveEventArgs args)
{
    string platform = Environment.Is64BitProcess ? "x64" : "x86";
    string assemblyName = new AssemblyName(args.Name).Name;
    string assemblyPath = Path.Combine(
        Environment.CurrentDirectory, "SQLite", platform, assemblyName + ".dll");

    return !File.Exists(assemblyPath) ? null : Assembly.LoadFrom(assemblyPath);
}

そして、イベントハンドラーを設定します

AppDomain.CurrentDomain.AssemblyResolve += SQLitePlatformSpecificResolve;

メインアプリケーションのエントリポイント。これで、x86プラットフォーム用のx86アセンブリと、それに応じて64ビットプラットフォーム上のx64がロードされます。

ありがとう。

于 2012-07-24T13:15:58.860 に答える