2009-04-24 48 views
9

我想動態加載並使用Delphi Win32應用程序中用C#創建的.Net程序集。我的類和接口被標記爲ComVisible,但我想避免註冊程序集。 這可能嗎?如何從Win32使用.Net程序集而不註冊?

P.S.我在這裏找到了link text關於這個話題的另一個很好的討論,但它更多的是在主持CLR。這引出了一個問題 - 你爲什麼要主持CLR而不是使用ClrCreateManagedInstance?

+0

通過舉辦你獲得的被創建允許的事情如IIS和SQL Server控制的CLR如何運作的諸多方面的內存管理和異常處理鉤子控制的CLR。 – dthorpe 2011-05-20 01:39:34

+0

@dthorpe另外,如果您想使用.Net4,它看起來像CLR託管是唯一的選擇。你知道它是否有更多的開銷與ClrCreateManagedInstance或註冊的COM實例嗎? – 2011-05-21 04:40:44

+0

我會認爲開銷是相同的。在所有這三種情況下,都必須將CLR加載到流程中。唯一的區別是負載是由誰啓動的。 – dthorpe 2011-05-23 16:53:49

回答

8

奇怪的是,我無法在StackOverflow上找到答案,並且網上沒有太多東西,尤其是對於Delphi。我發現來自示例的解決方案發布了here。 這是我在結束了:

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; 

BTW,根據不同的情況,你可能想MSCOREE.DLL動態加載,因爲它可能是不存在的系統(XP沒有.Net框架)上

編輯:不幸的是,這已被棄用,並停止與.Net4一起工作,因爲我剛剛發現。這隻剩下兩個選項 - CLR hosting and unmanaged export。另外,debugging of .Net4 COM code is broken

0

不幸的是,在不暴露COM對象的情況下無法完成(據我所知),因爲.NET dll沒有真正編譯到Delphi(或任何其他)可以加載的庫中,因爲這完全是由JIT編譯器在運行時。

+0

但是你不一定需要註冊COM類。 – 2009-04-24 19:51:47

相關問題