2

次のヘッダーを使用してC++で記述された関数があります。

void EncodeFromBufferIN(void* bufferIN,int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize);

このように.hファイルと.cppファイルを編集して、C#でDLLをインポートすることで関数を呼び出せるようにしました。

**EncodeFromBufferIN.h**
extern "C" {
     __declspec(dllexport) void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize);
}
**EncodeFromBufferIN.cpp**
extern void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize){
    // stuff to be done
}

しかし、今の私の問題は、C#で関数を呼び出す方法がわからないことです。C#で次のコードを追加しましたが、パラメーターを関数に渡す方法がわかりません。

[DllImport("QASEncoder.dll")]
        unsafe public static extern void EncodeFromBufferIN(void* bufferIN, int bufferINSize, out char[] bufferOUT, out int bufferOUTSize);

bufferINとbufferOUTは文字列である必要がありますが、次のような関数を呼び出す場合は次のようになります。

public string prepareJointsForQAS()
{
   string bufferIN = "0 0 0 0 0";
   char[] bufferOUT;
   int bufferOUTSize;
   EncodeFromBufferIN(bufferIN, bufferIN.Length, bufferOUT, bufferOUTSize);
}

このエラーが発生します:「...に最適なオーバーロードされたメソッドmatrchにはいくつかの無効な引数があります」。では、パラメータをどのように渡す必要がありますか?

4

2 に答える 2

5

マーシャリングは、Cスタイルの呼び出しで最適に機能します。したがって、パブリックインターフェイスでは純粋なCを使用するのが最善です。ネイティブコードを次のように変更することが可能である場合

void EncodeFromBufferIN(
    unsigned char* bufferIN, 
    int bufferINSize, 
    unsigned char* bufferOUT,     
    int* bufferOUTSize);

次に、C#での呼び出しは次のようになります

[DllImport("QASEncoder.dll")]
public static extern void EncodeFromBufferIN(
    String bufferIN, 
    int bufferINSize, 
    StringBuilder bufferOUT, 
    ref int bufferOUTSize);

String inStr = new String(255);
int inSize = 255;
// make an educated estimate for the output size 
// and preallocate in C# (I am guessing 255)
StringBuilder outStr = new StringBuilder(255);
int outSize = 255;

EncodeFromBufferIN(inStr, inSize, outStr, outSize);

このようにして、(実行可能ではありますが)厄介になる可能性のあるアンマネージコードでのメモリ割り当てを回避できます。

これでうまくいくことを願っています。

于 2012-09-27T11:54:47.363 に答える