.NET Core 2.1 - Как создать COM-объект и сгенерировать файл *.tlb
Я хотел бы построить COM-объект в.net Core, а затем зарегистрироваться в RegAsm.
Мой файл.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp2.1;net4.7.2</TargetFrameworks>
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
<Platforms>x64</Platforms>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
</Project>
Моя программа.cs:
using System;
using System.Runtime.InteropServices;
namespace ComExample
{
[Guid("7ce1e40f-760a-4d81-b70b-61108ed15cb4")]
[ComVisible(true)]
public interface IComExampleClass
{
IComModelClass ExampleMethod(string param1, string param2);
}
[Guid("a8436b3f-3657-4a01-a133-fd333a84cb58")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class ComExampleClass : IComExampleClass
{
public IComModelClass ExampleMethod(string param1, string param2)
{
return new ComModelClass()
{
Result = $"{param1} + {param2}"
};
}
}
[Guid("9f5aeede-ec3e-443d-8ba0-9a9f2a6b9e53")]
[ComVisible(true)]
public interface IComModelClass
{
string Result { get; set; }
}
[Guid("526c6cb5-264d-4629-a894-fff02aeb9ec1")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class ComModelClass : IComModelClass
{
public string Result { get; set; }
}
class Program
{
static void Main(string[] args)
{
var test = new ComExampleClass();
Console.WriteLine(test.ExampleMethod("A", "B").Result);
Console.ReadKey();
}
}
Я не могу зарегистрировать COM с помощью RegAsm из c:\Windows\Microsoft.NET\Framework64\v4.0.30319 после публикации проекта в целевой среде.netcore2.1.
После публикации проекта в net4.7.2 я могу зарегистрировать сборку с помощью RegAsm, а затем использовать ее в проекте CPP.
Я не могу сгенерировать файл tlb из основного проекта.net, используя TblExp.exe.
Это выглядит странно. Я могу зарегистрировать.Net Стандартные сборки. Если я создаю.Net Standard Library с вышеуказанным исходным кодом и csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
тогда RegAsm работает хорошо
RegAsm.exe /tlb:C:\[...]\DotnetStandardCom\bin\Debug\netstandard2.0\DotnetStandardCom.tlb C:\[...]\DotnetStandardCom\bin\Debug\netstandard2.0\DotnetStandardCom.dll
Microsoft .NET Framework Assembly Registration Utility version 4.7.3062.0
for Microsoft .NET Framework version 4.7.3062.0
Copyright (C) Microsoft Corporation. All rights reserved.
Types registered successfully
Assembly exported to 'C:\[...]\DotnetStandardCom\bin\Debug\netstandard2.0\DotnetStandardCom.tlb', and the type library was registered successfully
Но как я могу не зарегистрировать сборку.Net Core?
1 ответ
Теперь это возможно благодаря работе, проделанной в.NETCore версии 3. Как отмечалось в моем комментарии, хостинг был отсутствующим элементом в более ранних версиях.NETCore без замены mscoree.dll. Версия 3 предоставляет comhost.dll. Связанные, они также теперь могут поддерживать код C++/CLI, ijwhost.dll является заменой.
Вы регистрируете компонент, как вы это сделали с традиционными COM-серверами, используя Regsvr32.dll
Все, что вам нужно знать, доступно на этой странице MSDN, добавленной месяц назад. Имейте в виду, что.NETCore 3 по-прежнему качество предварительного просмотра прямо сейчас. И это только для Windows без пути миграции для Linux и macOS, COM слишком сильно привязан к сервисам, которые доступны только в Windows.
В качестве альтернативы COM вы можете разместить среду выполнения.NET Core в своем собственном процессе для вызова управляемого кода.
Хостинг среды выполнения.NET Core является сложным сценарием, и в большинстве случаев разработчикам.NET Core не нужно беспокоиться о хостинге, поскольку процессы сборки.NET Core предоставляют хост по умолчанию для запуска приложений.NET Core. Однако в некоторых особых случаях может быть полезно явно разместить среду выполнения.NET Core либо для вызова управляемого кода в собственном процессе, либо для получения большего контроля над тем, как работает среда выполнения.
Ссылки: