Usando uma DLL COM do C # sem uma biblioteca de tipos
Eu preciso usar um componente COM (um dll) desenvolvido em Delphi idades atrás. O problema é: a dll não contém uma biblioteca de tipos ... e todos os recursos de interoperabilidade (por exemplo, TlbImp) no .NET parecem depender de TLBs. O componente tem sido usado em programas Delphi aqui por muitos anos sem problemas porque "Não é muito problema usar objetos COM do Delphi, porque sabemos as interfaces" (citar desenvolvedor Delphi).
Existe alguma maneira eu posso usar essa DLL de c # sem um TLB? Eu tentei usar a DLL como não gerenciada, mas o único método que exporta sãoDllUnregisterServer
, DllRegisterServer
, DllCanUnloadNow
eDllGetClassObject
. Eu sei os nomes das classes e funções que vou usar, se isso puder ser de alguma ajuda.
ATUALIZAR: Eu tentei implementar a sugestão de Jeff, mas estou recebendo este erro:
"Não é possível converter o objeto COM do tipo 'ComTest.ResSrvDll' para o tipo de interface 'ComTest.IResSrvDll'. Essa operação falhou porque a chamada QueryInterface no componente COM para a interface com o IID '{75400500-939F-11D4-9E44-0050040CE72C} 'falhou devido ao seguinte erro: Nenhuma interface suportada (Exceção de HRESULT: 0x80004002 (E_NOINTERFACE)). "
Isso é o que eu fiz:
Eu tenho essa definição de interface de um dos 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>
A partir disso eu fiz essa interface
<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>
E este coclass (pegou o guia dos delphi-guys)
<code>using System.Runtime.InteropServices; namespace ComTest { [ComImport] [Guid("75400503-939F-11D4-9E44-0050040CE72C")] public class ResSrvDll { } } </code>
ATUALIZAR
A solução de Jeff é a maneira de fazer isso. Vale a pena notar, porém, que a definição da interface deve coincidir com os componentes COMexatamente! ie. mesma ordem, mesmos nomes, etc.