2011-01-31 12 views
0

C#でC++ DLLを使用しようとしています。C#アプリケーションからC++ライブラリを使用する場合のマーシャリングエラー

機能C++では

は次のように定義される:C#では、私はとしてそれを定義した

byte* GetEntityUserData(TEntity entity) 

object[] o = LE.GetEntityUserData(entity); 
:私は、次の使用をやろう

[DllImport(EngineDll)] 
public static extern object[] GetEntityUserData(TEntity entity); 

次のエラーが発生します。

Cannot marshal 'return value': Invalid managed/unmanaged type combination.

C#プログラムはコンパイルされますが、実行時エラーが発生します。

+1

C++の宣言をvoid *に変更します。これは、「ここにはバイトの集まりがあり、それを並べ替えること」がより正確に表現されています。管理側のIntPtr、マーシャリングクラスが何らかの意味を打ち明ける。明らかに、配列ではありません。 –

答えて

3

表現するデータは何ですか?私はobject[]ではなく、byte[]を返すようにC#のシグネチャを変更します。アンマネージ関数から参照型を返すことはできません。値の型はプリミティブ型を意味し、structのものだけです。

+0

ええ、C++側のデータが何であるかを知ることは助けになります。バイト*バックを送信する際の1つの問題(char *とは何ですか?「バイト」はC++側で定義されていますか?)は、CLRマーシャラはマーシャルバックするバイト数を知らないため、 (MarshalAsAttributeを使用して)マーシャラにもっと情報を提供しますが、データが実際にどのようになるか、呼び出し元がバイト内のバイト数をどのように知っているかを知る必要があるでしょう。 –

+0

これは単なる不透明なブロブです取得し、後でネイティブコードに戻しますか?あなたは管理された側でそれを使用するつもりはありませんか? –

+0

@ user441521:それを使う必要がない場合は、戻り値の型を 'IntPtr'とタイプし、それを保持するだけです。 –

関連する問題