.NET Core 2.1 - 如何创建 COM 对象并生成 *.tlb 文件

.NET Core 2.1 - How to create COM object and generate *.tlb file

我想在 .net Core 中构建 COM 对象,然后通过 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>

我的program.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();
    }
}

在 .netcore2.1 目标框架中发布项目后,我无法使用来自 c:\Windows\Microsoft.NET\Framework64\v4.0.30319 的 RegAsm 注册 COM。

将项目发布到net4.7.2后,我可以通过RegAsm注册程序集,然后在CPP项目中使用它。

我也无法使用 TblExp.exe 从 .net 核心项目生成 tlb 文件。

看起来很奇怪。我可以注册 .Net 标准程序集。如果我使用上述源代码和 csproj 创建 .Net 标准库:

<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 程序集?

作为 COM 的替代方案,您可以在本机进程中托管 .NET Core 运行时以调用托管代码。

Hosting the .NET Core runtime is an advanced scenario and, in most cases, .NET Core developers don't need to worry about hosting because .NET Core build processes provide a default host to run .NET Core applications. In some specialized circumstances, though, it can be useful to explicitly host the .NET Core runtime, either as a means of invoking managed code in a native process or in order to gain more control over how the runtime works.

链接:

由于在 .NETCore 版本 3 上完成的工作,这现在是可能的。正如我在评论中指出的那样,托管是早期 .NETCore 版本中缺失的部分,无法替代 mscoree.dll。版本 3 提供 comhost.dll。相关的,他们现在也可以支持 C++/CLI 代码,ijwhost.dll 是替代品。

您可以像使用传统 COM 服务器一样注册组件,使用 Regsvr32.dll

一个月前添加的 this MSDN page 中提供了您需要了解的一切。请注意 .NETCore 3 现在仍然是预览质量。这是 Windows-only,没有针对 Linux 和 macOS 的迁移路径,COM 过于依赖仅在 Windows.

上可用的服务