He estado investigando sobre la interoperabilidad COM de .NET Core y cómo exponerlos .
Aunque tengo algunos problemas para llegar a una conclusión y comprender algunos conceptos. Mi jefe me dijo que hicieron algunas pruebas y pensaron que la única forma de crear código C# al que se pudiera llamar desde VB6 (incluidos los eventos) era crear un proyecto de .NET Framework, ya que no estaba disponible en .NET Core 3.1 (en el momento en que tuvieron que usar esta función).
Pero al ver la página mencionada anteriormente y al investigar un poco más, creo que parece que .NET Core es compatible con esta interoperabilidad. Y no entiendo por qué la plataforma .NET Core no podría hacer esto.
Lo siento si esta pregunta no va aquí, pero ¿alguien podría arrojar algo de luz sobre este tema?
.NET Framework, .NET Core 3+ y .NET 5+ pueden exponer un objeto COM al mundo COM. Este mundo incluye VB6 y todo lo que puede hacer COM.
a) Cree un proyecto de biblioteca de clases .NET 5 "NetClassLibrary" (utilizando Visual Studio, por ejemplo)
b) Agregue un archivo NetComObject.cs con el siguiente código, por ejemplo:
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) Modifique .csproj para establecer la propiedad EnableComHosting en true y asegúrese de compilar para x86 ya que VB6 es un programa de 32 bits (tenga en cuenta que si usa VBA de 64 bits de Excel, no VB6, debe compilar para 64 bits) , así por ejemplo:
<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) Compile, inicie un indicador de administración y ejecute esto:
regsvr32 yourPathTo\NetClassLibrary.comhost.dlle) Cree un proyecto VB6, agregue este código 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 Subf) Ejecutar
Nota 1: también puede usar un atributo ProgId , como lo hacen a menudo los objetos COM, no tiene que ceñirse solo a Guids...
Nota 2: solo he usado la interfaz IDispatch ("Lazy Loading") para esta demostración, pero también puede usar interfaces derivadas de IUnknown ("Early Loading") y TLB. Lamentablemente, .NET 5 no crea el .TLB por usted, tendrá que compilarlo usted mismo o crearlo con otra herramienta e importarlo en .NET y/o en VB6.