как маршализовать универсальные шаблоны?
От: Аноним  
Дата: 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;
    }
}

к сожалению, это не работает — вылетает экзепшен по нарушению памяти
есть какой-нибудь способ это сделать универсально?
спасибо
Re: как маршализовать универсальные шаблоны?
От: Sinatr Германия  
Дата: 02.12.13 07:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>есть какой-нибудь способ это сделать универсально?


"Разрулить" в С#:

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");
    }
}
---
ПроГLамеры объединяйтесь..
Re[2]: как маршализовать универсальные шаблоны?
От: Аноним  
Дата: 02.12.13 10:29
Оценка:
Здравствуйте, 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>

спасибо, я тоже пришел к этой ассоциации первого уровня.
а общего решения нет в силу особенности с#?
Re[3]: как маршализовать универсальные шаблоны?
От: Sinatr Германия  
Дата: 02.12.13 11:18
Оценка:
Здравствуйте, Аноним, Вы писали:

Если подумать. Хочется разные "наружные" функции вызывать из одного метода. Либо они все должны быть обьявлены внутри метода, либа их нужно "привести" к формату, пригодному для универсального вызова (во враппере). Имхо, первый способ (первого лвл) очевиднее и гуманнее.
---
ПроГLамеры объединяйтесь..
Re[4]: как маршализовать универсальные шаблоны?
От: Аноним  
Дата: 03.12.13 06:10
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


S>Если подумать. Хочется разные "наружные" функции вызывать из одного метода. Либо они все должны быть обьявлены внутри метода, либа их нужно "привести" к формату, пригодному для универсального вызова (во враппере). Имхо, первый способ (первого лвл) очевиднее и гуманнее.

спасибо!
а почему таки ref T data не работает?
там же ведь по идее в момент вызова все уже должно было быть приведено к &int или &double...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.