как маршализовать универсальные шаблоны?
От: Аноним  
Дата: 29.11.13 16:52
Оценка:
всем привет!

есть некая 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;
    }
}

к сожалению, это не работает — вылетает экзепшен по нарушению памяти
есть какой-нибудь способ это сделать универсально?
спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.