c# - 我可以将 .NET 5 COM 互操作对象与 VB6 连接吗?

标签 c# .net com vb6 com-interop

我一直在研究 .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 世界公开 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属性(property)到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
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
注 1:您可以使用 ProgId属性也是如此,就像 COM 对象经常做的那样,你不必只坚持使用 Guids ......
注 2:我只用过 IDispatch (“延迟加载”)界面用于此演示,但您可以使用 IUnknown - 派生接口(interface)(“早期加载”)和 TLB。不幸的是,.NET 5 不会为您创建 .TLB,您必须自己构建它或使用其他工具创建它并将其导入到 .NET 和/或 VB6 中。

关于c# - 我可以将 .NET 5 COM 互操作对象与 VB6 连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69482805/

相关文章:

c# - Entity Framework 包括 Where

c# - Entity Framework 将本地数据添加到数据库中的列表

.net - WCF Mono - 使用 SSL 的 BasicHttpBinding

events - VBScript 中的 COM 事件处理程序

c++ - 错误 C2143 : syntax error : missing ';' before '__stdcall"

c# - 使用 Visual Studio 2019 将 FileSystemWatcher 作为 Windows 服务

c# - 如何捕获 EF 异常

c# - 是否可以在自己的 .Net 应用程序中嵌入 Windows Sidebar Widgets

c# - 如何从 .NET 中的内存映射文件中快速读取字节?

c++ - 调用 RevokeDragDrop 后的 "OLE The application called an interface that was marshalled for a different thread"是什么意思?