0

C++ プログラムを dll にコンパイルし、C# から使用したいと考えています。

これは c++ プログラムです。

MurmurHash3.h MurmurHash3.cpp

h および c++ ファイルのヘッダーとメソッド宣言を次のように変更しました。

void MurmurHash3_x64_128 ( const void * key, int len, uint32_t seed, void * out );

extern "C" __declspec(dllexport) void MurmurHash3_x64_128 
    (const void * key, const int len, const uint32_t seed, void * out )

3つの方法すべてで同じことをしました。次に、コンパイル ターゲットを dll に設定します。それをコンパイルした後、SMHasher.dll という名前の x64 ビット dll ができました。ここで、新しい x64 ビット C# プログラムを作成し、この dll を参照として使用しました。

次に、次のように書きました。

[DllImport("SMHasher.dll")]
public static extern void MurmurHash3_x64_128(byte[] valueToHash, int len, uint seed, out byte[] hash);

private void button1_Click(object sender, EventArgs e)
{
    byte[] hash;
    MurmurHash3_x64_128(new byte[] { 1, 2, 3 }, 3, 0, out hash);
}

MurmurHash3_x64_128 を呼び出すと、テスト アプリがエラー メッセージなしで閉じられます。

何が問題ですか?どうすれば解決できますか?

多分問題は c++ パラメータですか? 「const void * key」はバイト配列ではないのでしょうか?

4

2 に答える 2

1

このエラーは、32 ビット dll をインポートする 64 ビット アプリ、または 64 ビット dll をインポートする 32 ビット アプリであるために発生しています。

LoadLibrary は、アプリと同じビット数の dll であることを確認してください。

C# では、Visual Studio の構成プロパティを使用して、アプリの噛み合わせを設定できます。

于 2012-09-06T11:59:32.793 に答える
1

呼び出し規約に注意してください。

c/c++ では、cdecl がデフォルトです。しかし、C# の [DllImport] では stdcall です。

次のように C++ 関数を定義してみてください。

void __stdcall MurmurHash3_x64_128 ( const void * key, int len, uint32_t seed, void * out );

また、関数名が変更されていないことを確認するには、.def ファイルを使用することをお勧めします。

もう1つ、メモリを割り当てていないため、byte[] hash;スタックが破損する可能性があります...

于 2012-09-06T12:50:14.697 に答える