Итак, у меня есть исходный код C .dll, который я хочу использовать в своем приложении C #.Вместо того чтобы делать кучу DllImports, я решил написать оболочку для него на C ++ / CLI.
Моя функция C получает указатель на структуру с 4 функциями обратного вызова:
typedef struct
{
PFN_IN readFp;
PFN_OUT writeFp;
}OPEN_ARGS;
C ++ / CLI использует один и тот же файл .h, поэтому использует тот же typedef.
Код 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 в ссылки на проекты C #, компилятор не будет принимать вызовы функций C ++ / CLI, говоря:
"Error 2 Argument 2: cannot convert from 'WrapperTest.Program.OPEN_ARGS' to 'SAR_OPEN_ARGS'"
Но если явключите dll C ++ / CLI неявно, как это
[DllImport("Wrapper.dll", CharSet = CharSet.Auto, EntryPoint = "?CLIOpen@@YAHHUOPEN_ARGS@@@Z")]
public static extern int CLIOpen(int a, OPEN_ARGS args);
Это будет работать просто отлично.
Так есть ли способ сказать компилятору C # игнорировать эту ошибку приведения типа или может быть другой способ обернуть функции кода C?
EDIT: очищены имена переменных для лучшей читабельности