У меня есть MF C COM-сервер (ActiveX) и MF C COM-клиент. Сервер построен на основе следующего IDL:
library SomeLib
{
importlib(STDOLE_TLB);
[ uuid(some-guid),
dispinterface ISomeIntf
{
methods:
[id(1)] HRESULT Foo( );
}
[ uuid(some-guid),
coclass SomeClass
{
[default] dispinterface ISomeIntf;
};
}
Клиент использует Invoke через оболочки, сгенерированные директивой #import библиотеки типов из IDL (tlb, созданный MIDL), для вызова в COM-сервере.
Я начал замену COM-сервера в. NET. Вот что я сделал:
- с использованием tblimp.exe для создания сборки, описывающей интерфейс
- создал библиотеку классов C#, OM visible и добавил ссылку на сборку создан из IDL
- реализован видимый класс COM, полученный из интерфейса, как определено в сборке
- Сборка и регистрация. NET COM-сервера
Это это каким-то образом C# код:
using System;
using System.Runtime.InteropServices;
namespace SomeLibNS
{
[ClassInterface(ClassInterfaceType.None), Guid("some-guid"), ProgId("SomeLibNS.SomeLib.1")]
[ComVisible(true)]
public partial class SomeLibCtrl : SomeLib
{
void Foo ()
{
// Do something right here
}
}
}
Теперь моя проблема ...
Все сборки в порядке, и когда COM-клиент вызывает функцию на сервере, функция выполняется. Это означает, что связанные с COM вещи для создания и вызова COM-сервера работают. HRESULT клиентов в Invoke равен 0x80020005 (DISP_E_TYPEMISMATCH). Когда я изменяю IDL, чтобы не возвращать HRESULT, перестроить клиент и сервер, все работает нормально. Когда я не использую сборку, созданную tlbimp, и определяю свой собственный интерфейс, имеющий ту же подпись, что и в IDL, он также работает. Согласно MS do c, HRESULT преобразуется в void, а о сбоях на сервере сообщается с помощью исключения, которое маршалируется в HRESULT. Но это, кажется, не так, почему-то ??
Что я не так, чего не понимаю?
Спасибо.