因此,我有這個C .dll源代碼,我想在我的C#應用程序中使用它。我決定在C++/CLI中爲它編寫一個包裝器,而不是做大量的DllImport。用於C dll的C++/CLI包裝
我的C函數需要一個指針到一個結構與4個回調函數在它:
typedef struct
{
PFN_IN readFp;
PFN_OUT writeFp;
}OPEN_ARGS;
C++/CLI共享相同的h文件,因此使用相同的類型定義。
C#代碼有它自己定義的這個結構和代理CB,因爲我不能將.h添加到C#項目中。
[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 DLL明確到C#項目引用,該compliler不會接受以C++/CLI函數的調用說
"Error 2 Argument 2: cannot convert from 'WrapperTest.Program.OPEN_ARGS' to 'SAR_OPEN_ARGS'"
但是,如果我包括C++/CLI dll隱含的那樣
[DllImport("Wrapper.dll", CharSet = CharSet.Auto, EntryPoint = "[email protected]@[email protected]@@Z")]
public static extern int CLIOpen(int a, OPEN_ARGS args);
它會工作得很好。
那麼有沒有辦法告訴C#編譯器忽略這種類型轉換錯誤,或者可能是其他方式來包裝C代碼函數?
編輯:清理變量名更好readabiltiy
感謝您的建議。聽起來是一個好主意。 ps。由於某種原因,我不能upvote你的帖子:o – fl0sT