Usando un dll COM de C # sin una biblioteca de tipos
Necesito usar un componente COM (un DLL) desarrollado en Delphi hace mucho tiempo. El problema es que: la dll no contiene una biblioteca de tipos ... y todas las funciones de interoperabilidad (por ejemplo, TlbImp) en .NET parecen depender de los TLB. El componente se ha utilizado aquí en los programas de Delphi durante muchos años sin problemas porque "no es un problema utilizar objetos COM de Delphi, porque conocemos las interfaces" (cita al desarrollador de Delphi).
¿Hay alguna manera de que pueda usar esta DLL desde c # sin un TLB? He intentado usar la DLL como no administrada, pero el único método que exporta esDllUnregisterServer
, DllRegisterServer
, DllCanUnloadNow
yDllGetClassObject
. Sé que los nombres de las clases y funciones que voy a usar, si eso puede ser de alguna ayuda.
ACTUALIZAR: He intentado implementar la sugerencia de Jeff, pero recibo este error:
"No se puede convertir el objeto COM del tipo 'ComTest.ResSrvDll' al tipo de interfaz 'ComTest.IResSrvDll'. Esta operación falló porque la llamada QueryInterface en el componente COM para la interfaz con IID '{75400500-939F-11D4-9E9-0050040CE72C} 'falló debido al siguiente error: No se admite dicha interfaz (excepción de HRESULT: 0x80004002 (E_NOINTERFACE)) ".
Esto es lo que he hecho:
Obtuve esta definición de interfaz de uno de los Delphi-guys:
<code>unit ResSrvDllIf; interface type IResSrvDll = interface ['{75400500-939F-11D4-9E44-0050040CE72C}'] procedure clearAll; function ResObjOpen(const aClientID: WideString; const aClientSubID: WideString; const aResFileName: WideString; aResShared: Integer): Integer; {safecall;} ... end; implementation end. </code>
De esto he hecho esta interfaz.
<code>using System.Runtime.InteropServices; namespace ComTest { [ComImport] [Guid("75400500-939F-11D4-9E44-0050040CE72C")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IResSrvDll { int ResObjOpen(string aClientID, string aClientSubID, string aResFileName, int aResShared); } } </code>
Y esta coclass (consiguió el guid de los delphi-guys)
<code>using System.Runtime.InteropServices; namespace ComTest { [ComImport] [Guid("75400503-939F-11D4-9E44-0050040CE72C")] public class ResSrvDll { } } </code>
ACTUALIZAR
La solución de Jeff es la forma de hacerlo. Vale la pena notar, sin embargo, que la definición de la interfaz debe coincidir con los componentes COMexactamente! es decir. mismo orden, mismos nombres, etc.