Что касается стандарта. NET, я могу ошибаться, но я думаю это здесь не применимо, потому что взаимодействие COM-объектов находится на более высоком уровне, чем у стандарта. NET таргетинг; мы можем говорить только о. NET Core или. NET Framework для взаимодействия COM.
Если вы хотите сгенерировать библиотеку типов, у вас есть несколько вариантов.
Безусловно, самый простой способ - просто использовать. NET Framework. Тот факт, что вы хотите создать библиотеку типов, сводит на нет преимущества. NET Core уже потому, что некоторые COM, особенно функции "Автоматизация", Windows -только. Использование Framework будет хорошо, по крайней мере, до тех пор, пока не выйдет NET Core 5.
Тем не менее, если у вас есть деловая причина для использования. NET Core, но вам все еще нужна поддержка COM, включая библиотеку типов, затем, основываясь на этом комментарии GitHub , вы сможете составить свой собственный IDL. Обратите внимание, что вам необходимо установить инструменты сборки C ++, потому что компилятор MIDL на самом деле не является отдельной вещью, которую вы можете получить без остальных инструментов сборки C ++.
Настоятельно рекомендуется прочитать документацию о том, как. NET Core обрабатывает активацию COM .
Предполагается, что наличие инструментов сборки C ++ не является препятствием для вам, шаги будут следующие:
1) Создайте файл .idl
, который определяет все ваши интерфейсы COM в формате IDL. Это требует некоторого перевода между интерфейсом. NET и интерфейсом COM. Вот частичный пример того, как вам нужно выполнить перевод между вашим C# интерфейсом и COM-интерфейсом, как определено в IDL:
[
Guid("<some gooey>"),
InterfaceType(ComInterfaceType.InterfaceIsDual)
]
public interface IFoo
{
string Bar { get; }
string Baz(int Fizz);
}
будет переведен в IDL:
[
uuid(<assembly gooey>),
version(1.0)
]
library myFoo
{
[
uuid(<some gooey>),
object,
dual
]
interface IFoo : IDispatch {
[propget] HRESULT Bar([out, retval] BSTR* retVal);
HRESULT Baz([in] long Fizz, [out, retval] BSTR* retVal);
}
}
После того как вы определили файл .idl
, и он является точным представлением, вы можете использовать MIDL для компиляции файла .idl
в файл .tlb
. Обычно что-то вроде midl foo.idl /tlb: foo.tlb
. Вам следует использовать справочник по языку MIDL , чтобы помочь вам написать файл .idl
. Для быстрого начала работы вы можете скопировать свои интерфейсы C# в проект фреймворка. NET, использовать tlbexp
, а затем oleview
(доступно через командную строку разработчика Visual Studio) или * 1036. * для просмотра итогового файла IDL для начала работы.
Следующим шагом является создание разделов реестра, чтобы ваш CLSID мог ссылаться на библиотеку типов. Вам понадобится GUID вашей сборки, и он также должен использоваться как library
uuid
в файле .idl
.
Используя пример интерфейса IFoo
, вам нужно будет создать реестр, подобный приведенному ниже (используя формат .reg для простого совместного использования / понимания и предполагая установку для пользователя, а не для компьютера):
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\Interface\{<some gooey>}]
@="IFoo"
[HKEY_CURRENT_USER\Software\Classes\Interface\{<some gooey>}\ProxyStubClsid32]
@="{00020424-0000-0000-C000-000000000046}"
[HKEY_CURRENT_USER\Software\Classes\Interface\{<some gooey>}\TypeLib]
@="{assembly gooey}"
"Version"="1.0"
Вам также потребуется создать реестр в CLSID
, Interface
, TypeLib
и Record
по мере необходимости. В этой статье представлен хороший обзор всех ключей реестра, но имейте в виду, что он предполагает. NET framework, а не. NET Core, поэтому не все ключи применимы, особенно в ветке CLSID .
Обратите внимание, что когда вы запускаете regsvr32
, он обычно создает ключи в ветвях CLSID
и Interface
, но вам нужно будет добавить ключи TypeLib
в ветке Interface
и также запись в ветку TypeLib
. Вам также нужно будет создать ключи ProgId
, если вы хотите поддерживать функциональность CreateObject
.
Изначально вы можете начать с файла .reg
, который можно обновлять и поддерживать вручную, но если у вас есть несколько объектов, тогда становится желательно автоматизировать это. Это также можно сделать с помощью вызова DllRegisterServer
, чтобы при выполнении regsvr32
он позаботился о регистрации ключей. С другой стороны, теперь вы загрязняете свою кодовую базу регистрационным кодом. Некоторые предпочитают использовать установщики для записи ключей реестра.
Надеюсь, это поможет вам начать!