2

C++ DLL にエクスポートされた関数があります。

// C++ DLL (Blarggg.dll)

extern "C"
{
     USHORT ReadProperty( BYTE * messsage, USHORT length, BYTE * invokeID ) 
    {
         if( invokeID != NULL ) {
            * invokeID = 10 ; 
        }
         return 0;
    }
}

自分の C# アプリケーションで利用できるようにしたい

// C# app 
[DllImport("Blarggg.dll")]
public static extern System.UInt16 ReadProperty(
        /* [OUT] */ System.Byte[] message,
        /* [IN]  */ System.UInt16 length,
        /* [OUT] */ System.Byte[] invokeID ); 


private void DoIt() 
{
    System.Byte[] message = new System.Byte[2000];
    System.Byte[] InvokeID = new System.Byte[1];
    System.UInt16 ret = ReadProperty( message, 2000, InvokeID ); // Error 
}

問題は、次のエラー メッセージが表示され続けることです。

タイプ 'System.NullReferenceException' の未処理の例外が Blarggg.dll で発生しました 追加情報: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

VS2008 を使用して、DLL と C# アプリケーションの両方をビルドしています。

私は C# プログラマーではありません。

私は何を間違っていますか?

4

4 に答える 4

2

コードを VS2008 に直接貼り付けたところ、32 ビット マシンで完全に動作しました (エクスポートされた名前を設定するために .def ファイルを追加しました)。あなたの C++ ライブラリは完全に純粋な win32 プロジェクトですか? あなたが与えたエラーメッセージは、CLR例外がスローされたことを暗示しているようです.

于 2009-10-21T22:32:12.683 に答える
2

これを試して:

[DllImport("Blarggg.dll", CallingConvention := CallingConvention.Cdecl)] 
public static extern System.UInt16 ReadProperty( 
        /* [IN]  */ System.Byte[] message, 
        /* [IN]  */ System.UInt16 length, 
        /* [OUT] */ out System.Byte invokeID );  


private void DoIt()  
{ 
    System.Byte[] message = new System.Byte[2000]; 
    System.Byte InvokeID; 
    System.UInt16 ret = ReadProperty( message, 2000, out InvokeID );
} 
于 2009-10-21T22:44:56.047 に答える
0

System.Runtime.InteropServices.Marshal クラスを使用して、マネージド型とアンマネージド型を変換する必要がある場合があります。

于 2009-10-21T21:54:38.323 に答える
0

C++ 型でこれを行うことはできますか?

DLLImport C dll しかできないという印象を受けました。

C++ Dll で DLLImport を使用しても問題ありませんが、外部関数を次のように宣言します。

extern "C" __declspec(dllexport) ...

このウェブページを見てください:

http://dotnetperls.com/dllimport-interop

于 2009-10-21T22:09:36.073 に答える