2012-07-24 9 views
5

を結ぶ可能性の重複:
Loading x86 or x64 assembly.NET AnyCPUプロジェクトは、プラットフォーム固有のライブラリに

私は、任意のCPU .NETプロジェクトをコンパイルしようとしているが、私は持っているのSQLiteライブラリをリンクする必要がありますx86およびx64プラットフォーム用の異なるバージョン。 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の重複のプロジェクトを持っています。もっと良いものはありますか?

UPDATE

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

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

+0

ありがとうございました。私はそのような投稿を見てきましたが、問題はDLLを変更するだけではあまり役に立ちません。 64ビットDLLを自分のフォルダにコピーしてもまだ動作しませんが、64ビットライブラリを参照するアプリケーションを再コンパイルする必要があります。私は何か間違っているのですか?また、どのバージョンを参照すればよいのか分かりません。 – axe

+1

はい。ネイティブライブラリは同じ名前である必要がありますが、別のフォルダ(アプリのサブフォルダなど)に配置する必要があります。実行時に、 'SetDllDirectory'を呼び出して、OSがビット数に応じて正しいフォルダを探すようにします。または、 'AppDomain.CurrentDomain.AssemblyResolve'イベントを[Roverの提案](http://stackoverflow.com/questions/3787428/loading-x86-or-x64-assembly#comment7029800_6060754)として使用してください。これらのライブラリを直接参照することはありません。SQLiteの管理対象ラッパーはそうです。あなたのコードは、ラッパーが基礎となるネイティブライブラリの正しいバージョンをロードするようにします。 – GSerg

+0

私はもう一度それを試しました、それは私のために動作しません。開始時にアプリケーションがクラッシュします。問題は私がプロジェクトでx64ライブラリを参照していることですが、私は実行時にx86ライブラリを選択します。私がx86ライブラリを使ってアプリケーションをビルドすると、それはx86ウィンドウで完全に動作します。そうでなければ、そうではありません。 – axe

答えて

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をロードします。

ありがとうございました。

関連する問題