7

我想在 .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>

我的程序.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 程序集吗?

4

2 回答 2

14

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

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

您需要知道的一切都可以在这个 MSDN 页面中找到,一个月前添加。请注意,.NETCore 3 目前仍处于预览质量状态。而且这是仅限 Windows,没有适用于 Linux 和 macOS 的迁移路径,COM 与仅在 Windows 上可用的服务紧密相关。

于 2019-08-25T13:39:52.430 回答
2

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

托管 .NET Core 运行时是一种高级方案,在大多数情况下,.NET Core 开发人员无需担心托管,因为 .NET Core 构建过程提供了默认主机来运行 .NET Core 应用程序。但是,在某些特殊情况下,显式托管 .NET Core 运行时可能很有用,既可以作为在本机进程中调用托管代码的一种方式,也可以更好地控制运行时的工作方式。

链接:

于 2018-08-17T18:20:52.857 回答