2017-01-09 10 views
0

私はC++プロジェクトから形成されたナゲットを持っています - そのナゲットの中に別のプロジェクトの(C#)RESTサービスコールで呼び出す静的クラスFileAccess.csの内部にGetBytesいくつかのデータを取得します。私はこのC#RESTサービスからGetBytesexternメソッドを呼び出すときはいつも何らかの理由でAccessViolationExceptionを取得します。このメソッドは2つの文字列と複数のint値を取り、IntPtrを返します。直接的にexternメソッドを呼び出すときにAccessViolationExceptionが発生する

違反を起こさない同様の呼び出しがあるので、私は混乱しています。主な違いは、このバージョンはexternメソッドを直接呼び出さないという点です。代わりに、externメソッドを呼び出す関数を含むC#DataGroupクラス(ナゲットの一部)を呼び出します。 DataGroupクラスメソッドは、byte[,]を返しますが、externメソッドを呼び出してデータをマーシャリングした後にのみ返します。

// AccessViolationもたらすバージョン:

IntPtrとしてのextern方法に
  1. RESTコール(IntPtr ptr = FileAccess.getBytes(...);
  2. のextern方法はIntPtr
  3. AccessViolationExceptionを返すは//と作業バージョンを

を発生します余分なクラス:

  1. byte[,]を返すデータグループメソッドへのREST呼び出し。 (例えばdataGroupInstance.getDataGroupBytes();
  2. のextern方法は方法getDataGroupBytes
  3. のexternメソッド内部と呼ばれているがIntPtrからIntPtr
  4. 方法getDataGroupBytesマーシャリングデータを返し、基本的byte[,]
  5. エラーなし

を返し、理由でありますexternメソッドを直接呼び出してAccessViolationException

+0

'FileAccess.getBytes(...);'メソッドがvarargsをとる場合は、PInvokeシグネチャに 'CallingConvention.Cdecl'を設定してください。 – Peter

答えて

0

それを見つけました。問題は私のパラメータの結果でした。私のC++関数は、を使用していたはずです。std::stringを使用しました。私はstd::string(パラメータとして使用されていた)のすべてのインスタンスをconst char*に置き換えましたが、私はもう例外を受け取りませんでした。

関連する問題