В поиске не нашел поэтому ->
имеется с++ длл с фабричными функциями.
в
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 переделывать пока не хочется.
Здравствуйте, 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)
{
}
}
Здравствуйте, ka1eka, Вы писали:
K>Ваша функция возвращает IntPtr.
K>Может быть так?
Так получаю более осмысленное сообщение об ошибке
Can not marshal return value: Pointers can not reference managed objects. Use byref instead.
Выходит, что через return не получится, обидно... , блин, а так хотелось через return

.