Замена неуправляемого (MF C) COM-сервера COM-сервером. NET, используемым в неуправляемых COM-клиентах (MF C) - PullRequest
0 голосов
/ 05 августа 2020

У меня есть 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. Но это, кажется, не так, почему-то ??

Что я не так, чего не понимаю?

Спасибо.

...