.NET Core: обработка событий при вызове сторонней 32-разрядной библиотеки DLL из 64-разрядной версии С#.

Я собираюсь перенести приложение .NET Framework 4.* на .NET 6. Основное приложение скомпилировано как 64-битное, и мне нужно использовать 32-битную (.NET 6) dll, размещенную вне процесса в суррогатной системе Windows ( dllhost), которые взаимодействуют со сторонним драйвером x86.

Я написал пример с 32-разрядным сервером, реализованным как класс C# в проекте библиотеки классов, размещенном на суррогатной системе Windows. Мне нужно обрабатывать события между основным приложением и dllhost, но в .NET 6 у меня есть следующее исключение во время регистрации обработчика событий:

Невозможно маршалировать «параметр № 1»: .NET Core не поддерживает маршаллинг делегатов в интерфейс _Delegate, предоставляемый библиотекой типов COM .NET Framework. Чтобы маршалировать делегат как интерфейс, маршалируйте его как указатель IDispatch.

Он отлично работает, если я компилирую оба с .NET 4.*.

Как определить и обработать события в реализации .NET 6?

Код класса:

      namespace OutOfProcCOM;

[ComVisible(true)]
[Guid(Contract.Constants.ServerInterface)]  //F586D6F4-AF37-441E-80A6-3D33D977882D
public interface IServer
{
    double Test();

    event OnMyEventDelegate OnMyEvent;
}

[ComVisible(true)]
[Guid(Contract.Constants.ServerInterface)]  //F586D6F4-AF37-441E-80A6-3D33D977882D
public delegate void OnMyEventDelegate(string text);

[ComVisible(true)]
[Guid(Contract.Constants.ServerInterface)]
public interface IMyEvents
{
    [DispId(1)]
    void OnMyEvent(string text);
}

[ComVisible(true)]
[ComSourceInterfaces(typeof(IMyEvents))]
[Guid(Contract.Constants.ServerClass)]  //"AF080472-F173-4D9D-8BE7-435776617347"
public sealed class DllServer : IServer
{
    public event OnMyEventDelegate OnMyEvent;

    public double Test()
    {
        OnMyEvent?.Invoke("Hello");

        return 10;
    }
}

Вот как я его регистрирую:

regsvr32.exe "DllServer.comhost.dll"

Запись в реестре

      Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Wow6432Node\AppID\{AF080472-F173-4D9D-8BE7-435776617347}]
"DllSurrogate"=""

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{AF080472-F173-4D9D-8BE7-435776617347}]
"AppID"="{AF080472-F173-4D9D-8BE7-435776617347}"

А вот клиент:

      var type = Type.GetTypeFromProgID("OutOfProcCOM.DllServer");
var obj = (IServer)Activator.CreateInstance(type);
obj.OnMyEvent += (OnMyEventDelegate)((t) =>
{
    Console.WriteLine(t);
});
var x = obj.ComputePi();

Спасибо!

0 ответов

Другие вопросы по тегам