4

XP から Vista に移行した直後に、C# プログラムが機能しないことに気付きました。

これが状況です。C# アプリケーションで使用する C++ dll を作成しました。DLL は XP では正常に動作しましたが、Vista に移行すると、C# では動作しなくなりました。

Delphiでテストしましたが、正常に動作しますが、C# - いいえ。

C# でのチェックを容易にするために、追加のコードを作成しました。

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

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

問題はどこにあるのでしょうか?

前もって感謝します。

4

3 に答える 3

11

x64 プラットフォームでは、JIT はプログラムを x64 にコンパイルします。ネイティブ C++ は x86 にコンパイルされるため、ロードに失敗します。
プログラムを x86 にコンパイルするように JIT に明示的に指示する必要があります。CorFlagsを使用するか、プロジェクト設定で CPU タイプを x86 に設定できます ([ビルド/プラットフォーム ターゲット] の下)。

于 2009-07-12T16:57:20.843 に答える
2

Shayには簡単な修正があります。アプリケーション全体を32ビットにして、WOW64で実行できるようにします。

ただし、「より良い」解決策は、C ++ dllを64ビットコードとして再構築して、プログラム全体を64ビットOSでネイティブに実行できるようにすることです。

于 2009-07-12T20:06:59.293 に答える
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();        
}
于 2009-07-13T01:38:44.477 に答える