Как использовать .Net сборку из Win32 без регистрации? - PullRequest
9 голосов
/ 24 апреля 2009

Я хотел бы динамически загрузить и использовать .Net-сборку, созданную в C # из приложения Delphi Win32. Мои классы и интерфейсы помечены как ComVisible, но я бы хотел избежать регистрации сборки. Возможно ли это?

P.S. Я нашел здесь текст ссылки еще одно хорошее обсуждение этой темы, но оно больше связано с размещением CLR. В связи с этим возникает вопрос: почему вы будете размещать CLR вместо ClrCreateManagedInstance?

Ответы [ 3 ]

8 голосов
/ 24 апреля 2009

Как ни странно, я не смог найти ответ по StackOverflow, и в Сети не так много, особенно для Delphi. Я нашел решение из примеров, размещенных здесь . Вот что я получил в конце:

function ClrCreateManagedInstance(pTypeName: PWideChar; const riid: TIID;
out ppObject): HRESULT; stdcall; external 'mscoree.dll';

procedure TMyDotNetInterop.InitDotNetAssemblyLibrary;
var
  MyIntf: IMyIntf;
hr: HRESULT;
NetClassName: WideString;
begin
//Partial assembly name works but full assembly name is preffered.
    NetClassName := 'MyCompany.MyDLLName.MyClassThatImplementsIMyIntf,
          MyCompany.MyDLLName';
    hr := ClrCreateManagedInstance(PWideChar(NetClassName), IMyIntf, MyIntf);
    //Check for error. Possible exception is EOleException with ErrorCode
    //FUSION_E_INVALID_NAME = $80131047 2148732999 : The given assembly name 
    //or codebase was invalid.
    //COR_E_TYPELOAD = $80131522 - "Could not find or load a specific type 
    //(class, enum, etc)"
    //E_NOINTERFACE = $80004002 - "Interface not supported".
    OleCheck(hr);
end;

Кстати, в зависимости от ситуации может потребоваться динамическая загрузка mscoree.dll, поскольку он может отсутствовать в системе (XP без .Net Framework)

РЕДАКТИРОВАТЬ: К сожалению, это устарело и перестало работать с .Net4, как я только что узнал. Это оставляет только два варианта - CLR-хостинг и неуправляемый экспорт . Также отладка COM-кода .Net4 не работает .

1 голос
/ 24 апреля 2009

Может быть, используя RegFreeCOM и обертку, вызываемую COm.

http://msdn.microsoft.com/en-us/magazine/cc188708.aspx

0 голосов
/ 24 апреля 2009

К сожалению, этого нельзя сделать (насколько мне известно) без раскрытия COM-объекта, поскольку DLL-библиотеки .NET не TRULY скомпилированы в библиотеку, которую может загрузить Delphi (или что-либо еще), поскольку все это выполняется JIT компилятор во время выполнения.

...