我可以将 .NET 5 COM 互操作对象与 VB6 连接吗?
Can I connect a .NET 5 COM interop object with VB6?
我一直在研究 .NET Core COM 互操作和 how to expose them。
虽然我在得出结论和理解一些概念时遇到了一些问题。
我的老板告诉我他们做了一些测试,他们认为创建可以从 VB6(包括事件)中调用的 C# 代码的唯一方法是创建一个 .NET Framework 项目,因为它在 .NET Core 3.1 中不可用(在他们必须使用此功能的那一刻)。
但是看到前面提到的页面并进行了更多研究,我确实认为 .NET Core 看起来支持这种互操作性。而且我不明白为什么 .NET Core 平台不能做到这一点。
如果这个问题不属于这里,我很抱歉,但是有人可以阐明这个问题吗?
.NET Framework、.NET Core 3+ 和 .NET 5+ 可以向 COM world 公开 COM 对象。这个世界包括 VB6 和一切可以做 COM 的东西。
a) 创建一个 .NET 5“NetClassLibrary”Class 库项目(例如使用 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) 编译,启动管理员提示符和 运行 this:
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) 运行
注意 1: 您也可以使用 ProgId 属性,就像 COM 对象经常做的那样,您不必只使用 Guids...
注意 2: 我只使用了 IDispatch
(“延迟加载”)接口用于此演示,但您可以使用 IUnknown
派生的接口(“早期加载”)和 TLB。不幸的是,.NET 5 不会为您创建 .TLB,您必须自己构建它或使用其他工具创建它,然后将其导入 VB6 中的 .NET and/or。
我一直在研究 .NET Core COM 互操作和 how to expose them。
虽然我在得出结论和理解一些概念时遇到了一些问题。 我的老板告诉我他们做了一些测试,他们认为创建可以从 VB6(包括事件)中调用的 C# 代码的唯一方法是创建一个 .NET Framework 项目,因为它在 .NET Core 3.1 中不可用(在他们必须使用此功能的那一刻)。
但是看到前面提到的页面并进行了更多研究,我确实认为 .NET Core 看起来支持这种互操作性。而且我不明白为什么 .NET Core 平台不能做到这一点。
如果这个问题不属于这里,我很抱歉,但是有人可以阐明这个问题吗?
.NET Framework、.NET Core 3+ 和 .NET 5+ 可以向 COM world 公开 COM 对象。这个世界包括 VB6 和一切可以做 COM 的东西。
a) 创建一个 .NET 5“NetClassLibrary”Class 库项目(例如使用 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) 编译,启动管理员提示符和 运行 this:
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) 运行
注意 1: 您也可以使用 ProgId 属性,就像 COM 对象经常做的那样,您不必只使用 Guids...
注意 2: 我只使用了 IDispatch
(“延迟加载”)接口用于此演示,但您可以使用 IUnknown
派生的接口(“早期加载”)和 TLB。不幸的是,.NET 5 不会为您创建 .TLB,您必须自己构建它或使用其他工具创建它,然后将其导入 VB6 中的 .NET and/or。