我可以用VB6连接.NET5COM互操作对象吗?

Can I connect a .NET 5 COM interop object with VB6?(我可以用VB6连接.NET5COM互操作对象吗?)
本文介绍了我可以用VB6连接.NET5COM互操作对象吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在研究.NET Core COM互操作和how to expose them。

虽然我在得出结论和理解一些概念方面有一些问题。 我的老板告诉我,他们做了一些测试,他们认为创建可从VB6内部调用的C#代码(包括事件)的唯一方法是创建.NET Framework项目,因为它在.NET Core 3.1中不可用(目前他们必须使用此功能)。

但是看到前面提到的页面并做了更多的研究,我确实认为.NET Core看起来支持这种互操作性。我不明白为什么.NET核心平台不能做到这一点。

如果这个问题不属于这里,我很抱歉,但是有人可以解释一下这个问题吗?

推荐答案

.NET Framework、.NET Core3+和.NET 5+可以向COM世界公开COM对象。这个世界包括VB6和所有可以做COM的东西。

a)创建.NET 5 NetClassLibrary&q;类库项目(例如使用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,并确保为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 yourPathToNetClassLibrary.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对象经常做的那样,您不必只使用Guid.

注意2:在本演示中,我只使用了IDispatch(&Quot;Lazy Loding&Quot;)接口,但是您也可以使用IUnknown派生的接口(&qot;Early Load&Quot;)和TLB。遗憾的是,.NET5不能为您创建.TLB,您必须自己构建它,或者使用其他工具创建它,然后将其导入到.NET和/或VB6中。

这篇关于我可以用VB6连接.NET5COM互操作对象吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)