Как использовать.Net сборку из Win32 без регистрации?

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

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

3 ответа

Решение

Как ни странно, я не смог найти ответ по Stackru, и в Сети не так много, особенно для 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 не работает.

Может быть, используя RegFreeCOM и COm-Callable Wrapper.

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

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

Другие вопросы по тегам