質問

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 
}

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

  

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

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

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

何が間違っているのですか?

役に立ちましたか?

解決

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

他のヒント

これを試してください:

[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 );
} 

System.Runtime.InteropServices.Marshalクラス。マネージ型とアンマネージ型の間で変換します。

C ++型でこれを実行できますか?

DLLのインポートはCのDLLしかできないという印象を受けました。

C ++ DllでDLLImportを使用しますが、外部関数を次のように宣言します

extern "C" __declspec(dllexport) ...

次のWebページをご覧ください:

http://dotnetperls.com/dllimport-interop

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top