Использование COM DLL из C # без библиотеки типов

Мне нужно использовать COM-компонент (dll), разработанный в Delphi много лет назад. Проблема в том, что dll не содержит библиотеки типов ... и каждая функция взаимодействия (например, TlbImp) в .NET, похоже, полагается на TLB. Компонент использовался здесь в программах Delphi в течение многих лет без проблем, потому что «Использование COM-объектов из Delphi не представляет большой проблемы, потому что мы знаем интерфейсы» (цитата из Delphi Developer).

Есть ли способ использовать эту DLL из C # без TLB? Я пытался использовать DLL как неуправляемую, но единственным методом, который она экспортирует, являетсяDllUnregisterServer, DllRegisterServer, DllCanUnloadNow а такжеDllGetClassObject. Я знаю имена классов и функций, которые я собираюсь использовать, если это поможет.

ОБНОВИТЬ Я пытался реализовать предложение Джеффа, но получаю эту ошибку:

"Невозможно привести объект COM типа ComTest.ResSrvDll к типу интерфейса ComTest.IResSrvDll. Эта операция завершилась неудачно, поскольку вызов QueryInterface для компонента COM для интерфейса с IID" {75400500-939F-11D4-9E44-0050040CE72C } 'не удалось из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)). "

Вот что я сделал:

Я получил это определение интерфейса от одного из Delphi-парней:

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

Из этого я сделал этот интерфейс

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

И этот класс (получил гид от дельфи-парней)

<code>using System.Runtime.InteropServices;

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

ОБНОВИТ

Решение от Джеффа - способ сделать это. Однако стоит отметить, что определение интерфейса должно соответствовать COM-компонентав точк! то есть. тот же порядок, те же имена и т. д.

Ответы на вопрос(7)

Ваш ответ на вопрос