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