Utilicé C omponent O bject M odel (COM) en .NET Framework antes para usar mi biblioteca de clases C# en Delphi como se muestra en este tutorial de YouTube , que funcionó sorprendentemente bien. Sin embargo, ahora quiero usar .NET Core 6 en su lugar.
Siguiendo el tutorial oficial de Microsoft "Exponer los componentes de .NET Core a COM" , creé esta interfaz
using System.Runtime.InteropServices; [ComVisible(true)] [Guid(6775d93d-cf14-42b9-83db-425bac0acf4d)] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IServer { public string getHelloWorld(); }y esta clase.
using System.Runtime.InteropServices; [ComVisible(true)] [Guid(d62bf794-d29e-4fcd-8637-994490264a93)] public class Server : IServer { public string getHelloWorld() { return "Hello World"; } }Después de compilar el proyecto, ejecuté este comando para registrar todos mis objetos .NET expuestos con COM.
regsvr32 MyProjectName.comhost.dll El comando se ejecutó con éxito. Ahora traté de importar el archivo .dll creado en Delphi, como lo hice antes con las bibliotecas de clases escritas en .NET Framework (consulte la marca de tiempo del tutorial de YouTube ). Sin embargo, Delphi se encuentra con un error porque no puede cargar la biblioteca de tipos.
Según la documentación oficial ...
A diferencia de .NET Framework, .NET Core o .NET 5+ no admiten la generación de una biblioteca de tipos COM (TLB) a partir de un ensamblado .NET. La guía es escribir manualmente un archivo IDL o un encabezado C/C++ para las declaraciones nativas de las interfaces COM. Si decide escribir un archivo IDL, puede compilarlo con el compilador MIDL de Visual C++ SDK para producir un TLB.
... no hay soporte en .NET Core para generar una librería de tipos.
Sin embargo, todavía hay una forma de producir manualmente un archivo TBL usando el compilador MIDL. Como puede leer en la documentación oficial , el compilador MIDL procesa un archivo IDL para generar una biblioteca de tipos. Dicho esto, creé este archivo IDL usando esta guía .
[ uuid(a93d03e0-9adf-4a2d-93e3-0ccfc2d8e1a6), lcid(0x0409), version(1.0), ] library MyProjectName { importlib("stdole.tlb"); [ uuid(16292ce5-ccd1-405d-9a70-ace42152bb15), oleautomation, dual ] interface IServer: IUnknown { HRESULT getHelloWorld([out, string] IServer** string); }; }; Sin embargo, aparece un error cuando ejecuto el siguiente comando para generar el archivo .tlb .
midl myProjectName.idl /tlb myProjectName.tlb > midl : command line error MIDL1005 : cannot find C preprocessor cl.exe Problema: busqué cl.exe en mi computadora pero no pude encontrar nada.
P.: ¿Alguien tiene alguna idea de cómo podría solucionar mi problema? Agradezco mucho cualquier tipo de ayuda, saludos!
Si no le importa cambiar a un enfoque diferente, puede compilar una biblioteca nativa desde .Net usando NativeAOT. Puedes encontrar un ejemplo aquí
Parece que está planeado que esté disponible en .Net 7 pero ya puedes empezar a usarlo con .Net 6.
¿No sería más fácil crear una API usando MVC y llamarla desde la aplicación Delphi? De esa manera puede evitar todos los problemas con las DLL.
Tal vez esta herramienta te ayude:
https://github.com/dspace-group/dscom
C:\> dotnet tool install dscom -g C:\> dscom tlbexport myassembly.dll