在 dotnet core 3.0 支持将库导出为COM组件,本文告诉大家如何将代码导出为 COM 组件
在导出 COM 组件的库,需要一个 GUID 声明这个 COM 接口
例如创建一个项目,在这个项目添加一个接口,通过以下方法标记为 COM 组件
这里的 Guid 是我自己设置的,可以在 VisualStudio 工具里面找到 GUID 创建选项,创建一个随机的 GUID 字符串
    [ComVisible(true)]    [Guid("5742D257-CCCC-4F7A-8191-6362609C458D")]    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]    public interface IFoo    {        /// <summary>        /// 有趣方法        /// </summary>        /// <returns></returns>        string Foo();    }上面代码就定义了一个接口,在相同的项目还需要写一个类实现这个接口
    [ComVisible(true)]    [Guid("5742D257-CCCC-4F7A-8191-6362609C458D")]    public class Foo : IFoo    {        /// <inheritdoc />        string IFoo.Foo()        {            return "林德熙是逗比";        }    }编辑这个项目的 csproj 添加属性 EnableComHosting 这样编译的时候才会生成可以导出为COM的文件
  <PropertyGroup>    <EnableComHosting>true</EnableComHosting>  </PropertyGroup>现在看起来的项目文件如下
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>    <OutputType>Library</OutputType>    <TargetFramework>netcoreapp3.0</TargetFramework>  </PropertyGroup>
  <PropertyGroup>    <EnableComHosting>true</EnableComHosting>  </PropertyGroup></Project>现在尝试编译这个项目,可以在输出路径里面找到 项目名.comhost.dll 文件,如创建的项目是 BearqalkeawaiKaleenemcemfo 那么在输出文件夹可以找到这个文件
BearqalkeawaiKaleenemcemfo.comhost.dll使用管理员运行命令行,输入下面代码注册 COM 文件
regsvr32 项目名.comhost.dll尝试创建一个新项目引用这个COM组件,使用的方法是定义一个接口
    [ComImport]    [CoClass(typeof(Foo))]    [Guid("5742D257-CCCC-4F7A-8191-6362609C458D")]    public interface IFoo    {        /// <summary>        /// 有趣方法        /// </summary>        /// <returns></returns>        string Foo();    }
    [ComImport]    [Guid("5742D257-CCCC-4F7A-8191-6362609C458D")]    internal class Foo    {    }这里定义的方法和其他使用COM的方法相同
        static void Main(string[] args)        {            var foo = new IFoo();            Console.WriteLine(foo.Foo());        }创建接口就可以使用方法
Exposing .NET Core Components to COM
  原文链接: http://blog.lindexi.com/post/dotnet-core-%E5%AF%BC%E5%87%BA-COM-%E7%BB%84%E4%BB%B6
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。