別の言語から使用するために開発されていない 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 例外がスローされます。そして、これの原因を探ろうとして、私はすでに頭がおかしくなりました。興味深いのは、これが私たちの大規模なアプリケーションでは機能しないことです (すべてのスイッチをオフにして、起動時に呼び出すだけでも)、私の小さなテスト アプリケーションでは機能します。
どんな助けでも大歓迎です。