私はC#アプリケーションで使用したいこのC .dllソースコードを持っています。 DllImportsの束をする代わりに、私はC++/CLIでそのためのラッパーを書くことに決めました。C++のC++/CLIラッパー
私のCの関数は、その中に4つのコールバック関数と構造体へのポインタを取ります。
typedef struct
{
PFN_IN readFp;
PFN_OUT writeFp;
}OPEN_ARGS;
C++/CLIは同じ.hファイルを共有し、したがって、同じのtypedefを使用しています。
C#コードには、C#プロジェクトに.hを付けることができないため、この構造体の独自の定義とCBの代理人があります。だから、
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate Int32 PFN_OUT(IntPtr arg, IntPtr pSrc, Int32 len);
[StructLayout(LayoutKind.Sequential)]
public struct OPEN_ARGS
{
public PFN_IN readFp;
public PFN_OUT writeFp;
};
、私はC++/CLIを追加するときに、明示的にC#のプロジェクトの参照に、++/complilerは
"Error 2 Argument 2: cannot convert from 'WrapperTest.Program.OPEN_ARGS' to 'SAR_OPEN_ARGS'"
を言っC++/CLI関数の呼び出しを受け入れないだろう。しかし、私はCが含まれている場合、DLL CLIは、暗黙的にその
[DllImport("Wrapper.dll", CharSet = CharSet.Auto, EntryPoint = "[email protected]@[email protected]@@Z")]
public static extern int CLIOpen(int a, OPEN_ARGS args);
のようにそれだけで正常に動作しますDLL。
このタイプのキャストエラーを無視するようにC#コンパイラに指示する方法はありますか、またはCコード関数をラップする方法は他にありますか?
EDIT:より良いreadabiltiy
提案していただきありがとうございます。良いアイデアのように聞こえる。 ps。何らかの理由で私はあなたの投稿をアップアップすることはできません: – fl0sT