Utilisation d'une DLL COM à partir de C # sans bibliothèque de types

J'ai besoin d'utiliser un composant COM (dll) développé en Delphi, il y a des siècles. Le problème, c'est que la dll ne contient pas de bibliothèque de type... et de tous les interop fonctionnalité (par exemple. TlbImp).NET semblent se fonder sur les Tlb. Le composant a été utilisé dans Delphi programmes ici pendant de nombreuses années sans problèmes, car "Il n'est pas beaucoup d'un problème à l'aide d'objets COM à partir de Delphi, car nous savons que les interfaces" (citation développeur Delphi).

Est-il une manière que je peux utiliser cette DLL à partir de c# sans TLB? J'ai essayé d'utiliser la DLL en tant que non géré, mais la seule méthode qu'il exportations sont DllUnregisterServerDllRegisterServerDllCanUnloadNow et DllGetClassObject. Je sais les noms des classes et des fonctions que je vais utiliser, si cela peut être d'une aide quelconque.

Mise à JOUR:
J'ai essayé de mise en œuvre de Jeff suggestion, mais j'obtiens cette erreur:

"Impossible de convertir COM objet de type" ComTest.ResSrvDll' à l'interface de type " ComTest.IResSrvDll'. Cette opération a échoué car l'appel de QueryInterface sur le composant COM pour l'interface avec IID '{75400500-939F-11D4-9E44-0050040CE72C} a échoué en raison de l'erreur suivante: cette interface n'est Pas pris en charge (Exception de HRESULT: 0x80004002 (E_NOINTERFACE))."

C'est ce que j'ai fait:

J'ai eu cette définition de l'interface de l'un de Delphes-les gars:

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.

À partir de ce que j'ai fait cette interface

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);

    }
}

Et ce coclasse (obtenu le guid de delphes-les gars)

using System.Runtime.InteropServices;

namespace ComTest
{
    [ComImport]
    [Guid("75400503-939F-11D4-9E44-0050040CE72C")]
    public class ResSrvDll
    {
    }
}

Mise à JOUR

La solution de Jeff est la façon de le faire. Il est intéressant de remarquer, cependant, que la définition de l'interface doit correspondre à la COM-composants exactement! c'est à dire. même ordre, les mêmes noms, etc.

source d'informationauteur toxvaerd