1

別の言語から使用するために開発されていない C++ ライブラリを C# から使用していますが、今何かを変更するのは困難です。[DllImport] 呼び出しを使用していますが、ほとんどすべて正常に動作します。

ただし、C++ から C# への「後方」呼び出しを使用する必要があることを知っておいてください。したがって、C# では C++ 関数をサブスクライブする必要があります。C++ では、次のように実装されます。

INTF_API void __stdcall  Intf_InstallHandler(Intf_MailHdlPtrType Hdl)

typedef void (STDCALL  *Intf_MailHdlPtrType)(InstanceNoType instno, 
  const MailType* mail, rsuint16 mailsize);

(簡単にするために、メソッドからいくつかの引数を削除しました。それらは 2 バイトです - 重要ではありません) したがって、C# では次のようになります。

public delegate void MailEventHandler(byte Instance, MailType Mail, UInt16 MailLength);

 MailHandlerDef defHandler = (f) =>
                                        {
                                            var structure =
                                                (MailType)Marshal.PtrToStructure(f, typeof(MailType));
                                            handler(structure);
                                        };

        Externs.Intf_InstallMailHandler(defHandler);


 [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)]
    public static extern void Intf_InstallMailHandler(byte Instance, [MarshalAs(UnmanagedType.FunctionPtr)] MailHandlerDef MailHandler, PrimitiveType Primitive);

さまざまなプリミティブがあり (C++ dll では、すべてのメソッドがプリミティブであり、すべてのメソッドが call-and-wait メソッドとして、または計算の最後に mailHandler が呼び出される非同期メソッドとして実装されています)、すべてのプリミティブが機能します。 、1つを除いて。

このプリミティブが呼び出されると、スタックトレースなしで NullRef 例外がスローされます。そして、これの原因を探ろうとして、私はすでに頭がおかしくなりました。興味深いのは、これが私たちの大規模なアプリケーションでは機能しないことです (すべてのスイッチをオフにして、起動時に呼び出すだけでも)、私の小さなテスト アプリケーションでは機能します。

どんな助けでも大歓迎です。

4

1 に答える 1

1

.Net CLI C ++ラッパーを使用して、標準のC++コードを呼び出すことができます。

于 2012-04-23T12:02:36.827 に答える