Импорт AbstractFactory из C++ dll
От: j s p Украина  
Дата: 06.03.06 14:24
Оценка:
В поиске не нашел поэтому ->
имеется с++ длл с фабричными функциями.

в base.dll
IBase* CreateConcreteBase1();
IBase* CreateConcreteBase2();

где-то в base.h
interface IBase
{
    virtual double __stdcall GetDouble() const = 0;
};


в с# клиенте

public interface IBase
{
  double GetDouble();
}
[DllImport("qtu.dll", EntryPoint = "CreateConcreteBase1", CallingConvention = CallingConvention.StdCall)]    
private static extern IBase CreateConcreteBase1();

void Main()
{
  try
  {
    IBase base = CreateConcreteBase1();
  }
  catch (Exception e)
  {
    // получаем исключение SEHException c сообщением:
    // "External component has thrown an exception."
  }
}


Подскажите, что неправильно? Догадываюсь, что так просто не получается вернуть объект типа IBase, но вот что
делать не знаю.

ЗЫ. на COM переделывать пока не хочется.
Re: Импорт AbstractFactory из C++ dll
От: ka1eka Россия  
Дата: 06.03.06 14:55
Оценка:
Здравствуйте, j s p, Вы писали:

JSP>Подскажите, что неправильно? Догадываюсь, что так просто не получается вернуть объект типа IBase, но вот что

JSP>делать не знаю.

Ваша функция возвращает IntPtr.
Может быть так?
//...
[DllImport("qtu.dll", EntryPoint = "CreateConcreteBase1", CallingConvention = CallingConvention.StdCall)]    
unsafe private static extern IBase* CreateConcreteBase1();

unsafe void Main()
{
   try
   {
      IBase base = *CreateConcreteBase1();
   }
   catch (Exception e)
   {
   }
}
Re[2]: Импорт AbstractFactory из C++ dll
От: j s p Украина  
Дата: 06.03.06 15:12
Оценка:
Здравствуйте, ka1eka, Вы писали:
K>Ваша функция возвращает IntPtr.
K>Может быть так?

Так получаю более осмысленное сообщение об ошибке
Can not marshal return value: Pointers can not reference managed objects. Use byref instead.

Выходит, что через return не получится, обидно... , блин, а так хотелось через return .
Re: Импорт AbstractFactory из C++ dll
От: Mab Россия http://shade.msu.ru/~mab
Дата: 06.03.06 17:24
Оценка:
Здравствуйте, j s p, Вы писали:

Между "интерфейсами" C++ и интерфейсами .NET нет никакого прямого соответствия (тем более в C++ внутреннее устройство их зависит от конкретного компилятора). Так что исходная идея обречена на неудачу.

JSP>ЗЫ. на COM переделывать пока не хочется.

Вариантов не много:
1) COM interop
2) сделать plain C интерфейс
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.