Страницы

Поиск по вопросам

понедельник, 12 ноября 2018 г.

Как подружить C++ и C# через COM наиболее простым способом?

Все рецепты использования COM включают в себя создание библиотеки типов, ее регистрацию в реестре, регистрацию в реестре сервера...
В DLL-ке при этом надо создавать фабрику объектов.
Если есть исполнимый файл на C# и DLL на C++ - можно ли обойтись безо всех этих шагов и просто загрузить dll-ку?


Ответ

Да, можно. Технология COM не требует для своего использования какой бы то ни было регистрации в реестре!
Все перечисленные в вопросе шаги нужны для уменьшения связности модулей. Если вам эти шаги не подходят, не нужны или вам просто лень их делать - их можно пропустить.
Вот работающий минимальный пример.
C#
using System; using System.Runtime.InteropServices;
[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface ICallback { void execute(); }
class Program : ICallback { static void Main(string[] args) { SetCallbacks(new Program()); }
[DllImport("mylib", CallingConvention=CallingConvention.StdCall)] static extern void SetCallbacks(ICallback callback);
void ICallback.execute() { Console.WriteLine("Hello, world!"); } }
С++
#include "windows.h"
interface ICallback : IUnknown { virtual HRESULT __stdcall execute() = 0; };
extern "C" __declspec(dllexport) void __stdcall SetCallbacks(ICallback *cb) { cb->execute(); }

В примере выше интерфейсы на двух языках были составлены независимо. В принципе, это является двойной работой - поэтому имеет смысл составить интерфейс только 1 раз, после чего его импортировать.
Если интерфейс составляется в C++-проекте на языке IDL - то достаточно потом подключить библиотеку типов в C#-проект как зависимость. Регистрировать ее при этом не обязательно!
Если интерфейс составляется в C#-проекте, то надо обязательно поставить ему кроме перечисленных выше атрибут Guid и сделать его публичным. После этого можно вытащить библиотеку типов через tlbexp и подключить в C++-проект. Регистрировать библиотеку типов в реестре, опять-таки, не требуется.

Комментариев нет:

Отправить комментарий