私は、2つの引数byteとushortを持つC++のメソッドを持っています。これは非常に難しい構造体へのポインタを返します(これはC++プロジェクトのほぼすべての構造体の集合体です)。PInvoke addressing
私はこのメソッドをC#でDllImportを使って呼び出すと、例えば1と2を渡すと、ランダムなバイト番号と1で呼び出されます(最初の引数が2番目に渡され、メモリの異なるアドレス)。
リターン構造について私が考えることができる唯一の説明は正しくマップされていないため、すべてのパラメータにオフセットがあります。しかし、私はそれを確認する方法を知らない。 C#で生成されたマーシャリングされたデータのアドレスとサイズを表示できるツールはありますか?C++で受け取ったアドレスでそれらを確認できますか?またはあなたが提案できる他の解決策。 C++:
enum PrimitiveType: unsigned short
enum ErrorType : unsigned char
typedef struct
{
PrimitiveType Primitive;
unsigned char InstNo; /* The instance number. */
ErrorType ErrorCode; /* ERR_NO_ERROR */
unsigned char Active; /* True = relay active */
} GetRelayCfmType;
はsizeof(GetRelayCfmType)= 5
---更新---
C++やCのコード構造をコメントした後#Iは、試験これにコードを低下しました
C#:
Marshal.Sizeof(新しいGetRelayCfmType())== 6.
なぜ1バイトでサイズが異なるのですか? 更新。
今私の関数は(C++)である:
__declspec(dllexport) GetRelayCfmType __stdcall GetRelay_Blocking(unsigned char InstNo, RelayNoType No)
enum RelayNoType : unsigned char
ので、私が持っているC#で:
[DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)]
public static extern GetRelayCfmType GetRelay_Blocking(byte InstNo, RelayNoType No);
enum RelayNoType : byte
今、絵がいっぱいです。
ステップ1:私たちが手助けをするための十分なコードを示してください。 –
http://clrinterop.codeplex.com/releases/view/14120を使用してDLLimportコードが正しいことを確認しましたか? –
これは100+構造に似ています。私が言ったように、関数は非常に簡単です - それはバイトとushortを受け入れ、戻り値は悪魔です。それは100以上の構造から作られた組合です。また、NDAのためにアップロードすることはできません。問題がどこにあるのか分からないため、NDAをアップロードすることはできません。だからこそ私はあなたに問題がどこにあるのかを指摘しないように頼んでいますが、そのような問題のデバッグ方法の例を教えてください。 – Archeg