Все рецепты использования 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++-проект. Регистрировать библиотеку типов в реестре, опять-таки, не требуется.
Комментариев нет:
Отправить комментарий