2011-01-19 18 views
1

私は、C#アプリケーションの中のC++ dllで関数を呼び出す際に問題が発生しています。私はこのようにC#の内部関数を呼び出しています:P invoke in 64bit .net app to C++ 64ビットdll

これは、以下のようにC++ DLLにエクスポートされています。

これを呼び出すと、「外部コンポーネントが例外をスローしました」というメッセージが表示されます。例外は非常に説明的ではなく、非常に役に立たない。

輸出ビューアでDLLをプルアップすると、完全に定量化された宣言(IE public:void __cdecl CryptoPP :: X509PublicKey :: `vbase destructor '(void)__ptr64)を使って、私が呼び出す関数は、関数名RSAEncryptStringを表示するだけです。

これは、私が見ることのできる唯一の可能性のある問題です。おそらく、C#側で無効な宣言で関数を誤って呼び出すことにほかなりません。 System.Runtime.InteropServices.Marshalを使用していますか?

助けをお願い致します。< 3ありがとうございます。

+0

char *を返すC関数は非常に面倒です。古典的な間違いは、ローカル変数へのポインタを返すことです。これは、Cプログラムから呼び出されたときに動作する可能性があります。たとえそれがCコードで正しく行われ、malloc()を使って文字列バッファを割り当てるとしても、依然として解決できないメモリリークがあります。コードの作成者の助けが必要です。 –

答えて

3

私はあなたが最初の行を変更する必要があると思う:あなたは非常にわかりやすい取得したい場合は、あなたもこれらを追加することができます

[DllImport("cryptopp.dll", 
    CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 

public static extern IntPtr RSAEncryptString(
    [In, MarshalAs(UnmanagedType.LPStr)] string filename, 
    [In, MarshalAs(UnmanagedType.LPStr)] string seed, 
    [In, MarshalAs(UnmanagedType.LPStr)] string message); 

はIIRC CharSetが世話をするべきだと思います上記のように、エンコーディングの内容はMarshalAsも使用してください。


編集:

ああ、私はあなたがまだエラーが出る理由を私が得たと思います!あなたのコードはまだ上記の問題を抱えていましたが、stringオブジェクトを返すことができないので、それはまだ誤っています。あなたはポインタ(IntPtrのような)を返してからMarshal.PtrToStringAnsiを使用する必要があります! IntPtrタイプに

(最初はこれに答えるとき、私は本当にあなたの戻り値の型を見ていませんでした。)

+1

まだ同じ例外が発生しています...あなたの提案は意味がありますが、私は正直にこれがhehを動作させていないことに驚いています – sringer

+0

文字列型は技術的に 'LPCSTR'である' const char * '型です – Aphex

+1

@Aphex:ええ、私はそれを認識しています'In'は何のためのものなのですか?' UnmanagedType.LPCStr'メンバーはありません。 – Mehrdad

0

あなたがタイプconst char *LPCSTR)の戻り値を格納しようとしている表示されます(通常、 HANDLE秒、ないLPSTRのに使用される)、これを試してみてください:。

[DllImport("cryptopp.dll", CharSet = CharSet.Auto)] 
public static extern String RSAEncryptString(String filename, String seed, String message); 

またすなわち..., out String message)

、任意の引数が書き込まなっている場合、あなたはそのタイプの前に outを追加する必要がありますことを心に留めておきます
+0

このメソッドを試しましたが、運はありません:( – sringer

関連する問題