title | author | date | CreateTime | categories |
---|---|---|---|---|
dotnet core 导出 COM 组件 |
lindexi |
2019-09-22 20:25:38 +0800 |
2019-09-22 20:13:16 +0800 |
dotnet |
在 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());
}
创建接口就可以使用方法