2009-07-12 6 views
4

XPからVistaに移行した直後に、C#プログラムが動作しないことがわかりました。Vista x64でLoadLibraryが失敗する

これは、私がC#アプリケーションで使用しているC++のDLLを書いたものです.DVDはXPで正常に動作しましたが、Vistaに移行するとC#で動作しなくなりました。

私はDelphiでテストしましたが、うまく動作しますが、C# - いいえ。

私はC#で自分のチェックを容易にするための追加コードを書いています。

 if (LoadLibrary("blowfish.dll") == 0) 
     { 
      Misc.LogToFile("error", true); 
      Application.Exit(); 
     } 

そのライブラリでコンパイルされたので、それは、C++ランタイムを必要とせず、それは、C#をVista上でDelphiで動作しますが、ありません。

どこに問題がありますか?

ありがとうございます。

+1

このVista x86またはx64ですか? –

+0

Vista x64.The dllはx32用にコンパイルされています。 –

+0

それは問題ですか? –

答えて

11

x64プラットフォームでは、ネイティブC++がx86にコンパイルされているため、JITはプログラムをx64にコンパイルします。
あなたが明示的にx86のにプログラムをコンパイルするためにJITを指示する必要があり が、あなたはそれは、x86のCPUタイプを設定CorFlagsまたはプロジェクト設定を使用して

+0

ありがとう、これは私の問題を解決! –

2

シェイは、クイックフィックスを持っている(ビルド/プラットフォームターゲットの下で)行うことができます - 作りますあなたのアプリケーション全体が32ビットなので、WOW64で動作します。

しかし、「より良い」ソリューションは、64ビットのコードとしてC++のDLLを再構築して、プログラム全体を64ビットOS上でネイティブに実行できるようにすることです。

1

普通にコンパイルすると、CLRはアプリケーションをx64 Windowsでは64ビット、x86 Windowsでは32ビットとして実行します。プラットフォーム用の正しいネイティブイメージをロードする必要があります。 1つの解決策は、Shayが示唆しているように、あなたのアプリを32ビットCLRで動作させることです。

また、アプリケーションでネイティブポインタサイズを確認し、正しいネイティブイメージをロードすることもできます。

string blowfishdll = "blowfish.dll"; 
// detect 64-bit installations by looking at the native pointer size 
if(64 == IntPtr.Size * 8 ) 
    blowfishdll = "blowfish-x64.dll" 

if (LoadLibrary(blowfishdll) == 0)   
{ 
    Misc.LogToFile("error", true);    
    Application.Exit();   
} 
関連する問題