всем привет!
есть некая 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;
}
}
к сожалению, это не работает — вылетает экзепшен по нарушению памяти
есть какой-нибудь способ это сделать универсально?
спасибо
Здравствуйте, Аноним, Вы писали:
А>есть какой-нибудь способ это сделать универсально?
"Разрулить" в С#:
class MyBase<T> where T: struct
{
delegate int MyDelegate(string name, ref T value);
T ReadValue(string name)
{
if(T is double)
return Wrapper.readDouble(name, &retValue);
// ...
throw new NotImplementedException("blablabla");
}
}
Здравствуйте, Sinatr, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>есть какой-нибудь способ это сделать универсально?
S>"Разрулить" в С#:
S>S>class MyBase<T> where T: struct
S>{
S> delegate int MyDelegate(string name, ref T value);
S> T ReadValue(string name)
S> {
S> if(T is double)
S> return Wrapper.readDouble(name, &retValue);
S> // ...
S> throw new NotImplementedException("blablabla");
S> }
S>}
S>
спасибо, я тоже пришел к этой ассоциации первого уровня.
а общего решения нет в силу особенности с#?
Здравствуйте, Sinatr, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
S>Если подумать. Хочется разные "наружные" функции вызывать из одного метода. Либо они все должны быть обьявлены внутри метода, либа их нужно "привести" к формату, пригодному для универсального вызова (во враппере). Имхо, первый способ (первого лвл) очевиднее и гуманнее.
спасибо!
а почему таки ref T data не работает?
там же ведь по идее в момент вызова все уже должно было быть приведено к &int или &double...