.NET Framework、.NET Core 3 和 .NET 5/6/+ 可以将 COM 对象暴露给 COM 世界。这个世界包括 VB6 和所有可以使用 COM 的东西。
a)创建一个 .NET 5“NetClassLibrary”类库项目(例如使用 Visual Studio)
b)添加一个名为 NetComObject.cs
的文件,例如以下代码:
using System;
using System.Runtime.InteropServices;
namespace NetClassLibrary
{
[ComVisible(true)]
[Guid("cfb2ee8b-f2ec-447c-9f0d-ac19c9a6cc26")]
public class NetComObject
{
public string SayHello() => "Hello World from .NET " + RuntimeInformation.FrameworkDescription;
}
}
c) 修改.csproj文件,将EnableComHosting
属性设置为true
,并确保编译时选择x86,因为VB6是32位程序(注意,如果您使用Excel的64位VBA而不是VB6,则必须选择64位编译),例如:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<EnableComHosting>true</EnableComHosting>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
</Project>
d) 编译后,启动管理员权限的命令提示符,并运行此命令:
regsvr32 yourPathTo\NetClassLibrary.comhost.dll
![enter image description here](https://istack.dev59.com/zSCAX.webp)
e) 创建一个VB6项目,添加以下VB6代码:
Private Sub Form_Load()
Dim obj As Object
Set obj = CreateObject("new:{cfb2ee8b-f2ec-447c-9f0d-ac19c9a6cc26}") // TODO: use the same GUID!
MsgBox obj.SayHello()
End Sub
f) 运行
![enter image description here](https://istack.dev59.com/TDvfd.webp)
注意1:你也可以使用ProgId属性,就像COM对象经常这样做一样,你不必仅限于使用Guid...
注意2:我只在示例中使用了IDispatch
("延迟加载")接口,但你也可以使用从IUnknown
派生的接口("早期加载")和TLBs。不幸的是,.NET 5不会为你创建.TLB,你必须自己构建它或使用另一个工具创建它,并将其导入到.NET和/或VB6中。