У меня есть COM-класс, запрограммированный на C ++.
Это было сделано коллегой, который больше не работает здесь.
Это одна строка из файла IDL:
HRESULT MyMethod([out, size_is(255)] LPOLESTR arg1, [in, out] MyStruct* arg2);
Когда я добавляю ссылку на C ++ DLL в проект C # .Net, она переводится следующим образом:
void MyMethod([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder arg1, [In, Out] ref MyStruct arg2);
Мой тестовый код выглядит следующим образом:
StringBuilder sb = new StringBuilder();
MyStruct s = new MyStruct();
MyCOMClass c = new MyComClass();
c.MyMethod(sb, ref s);
Я также пытался сделать
StringBuilder sb = new StringBuilder(255);
С похожими результатами.
Я получаю исключение 0x800706e6, что означает RPC_S_INTERNAL_ERROR.
Я думаю, что проблема заключается в LPOLESTR / StringBuilder, потому что у меня есть несколько похожих проектов со строками, такими как BSTR * вместо LPOLESTR, и все работает правильно (они переводятся как «out String» вместо «StringBuilder»).
Существует пример приложения с DLL, написанной на VB6, и метод вызывается следующим образом:
Dim s as MyStruct
Dim str as String * 255
Dim c as new MyComClass()
c.MyMethod(str, s)
И все работает нормально.
Есть идеи о том, что происходит?