.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")] // TODO: change this GUID
public class NetComObject
{
public string SayHello() => "Hello World from .NET " + RuntimeInformation.FrameworkDescription;
}
}
c) 修改.csproj以设置EnableComHosting
财产给true
并确保你编译for 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
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) Run
Note 1:你可以使用ProgId属性也一样,就像 COM 对象经常做的那样,您不必只坚持使用 Guid...
Note 2:我只用过IDispatch
(“延迟加载”)接口用于此演示,但您可以使用IUnknown
- 派生接口(“早期加载”)和 TLB。不幸的是,.NET 5 不会为您创建 .TLB,您必须自己构建它或使用其他工具创建它并将其导入到 .NET 和/或 VB6 中。