.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 либо для вызова управляемого кода в собственном процессе, либо для получения большего контроля над тем, как работает среда выполнения.

Ссылки:

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