всем привет!
есть некая DLL, написанная на C++...
она экспортирует методы, описанные в h-файле как:
int readBoolean(const char* _pstName, int* _piBool);
int readInteger32(const char* _pstName, int* _piInt32);
int readDouble(const char* _pstName, double* _piDouble);
есть C#-wrapper над этой DLL, в нем описан интерфейс этих методов:
public unsafe static extern int readBoolean([In] String pstName, [Out] int[] piBool);
public unsafe static extern Int32 readInteger32([In] String pstName, [Out] Int32[] piInt32);
public unsafe static extern double readDouble([In] String pstName, [In, Out] double[] piDouble);
с таким интерфейсом работают только только неуниверсальные методы, типа:
double ReadValue(string name)
{
double retValue = 0;
var result = Wrapper.readDouble(name, &retValue);
return result != 0 ? 0 : retValue;
}
пробовал написать по другому интерфейс и реализовать универсальный метод для вызовов этих функций в базовом классе, что-то типа
public unsafe static extern int readInteger32([In] String pstName, ref int[] piBool);
public unsafe static extern Int32 readInteger32([In] String pstName, ref Int32[] piInt32);
public unsafe static extern double readDouble([In] String pstName, ref double[] piDouble);
...
class MyBase<T> where T: struct
{
delegate int MyDelegate(string name, ref T value);
T ReadValue(string name)
{
var retValue = default(T);
var result = MyDelegate(name, ref retValue);
return result != 0 ? default(T) : retValue;
}
}
к сожалению, это не работает — вылетает экзепшен по нарушению памяти
есть какой-нибудь способ это сделать универсально?
спасибо