2009-09-15 112 views
0

我有一個本地的c + +應用程序,我想使用一些單獨的託管DLL中的託管類型。我相信有一種方法可以做到這一點,並且仍然保持C++應用程序的完全本地化,即使用COM與.NET進行互操作。然而,我的問題是,我的應用程序必須最初在沒有安裝CLR的機器上運行,所以我不希望CLR被加載,除非我實際上使用調用到受管DLL的代碼路徑。如何從非託管應用程序中延遲加載託管的DLL?

我該如何延遲加載託管DLL?

回答

1

我認爲實現這一目標的最佳方式是通過COM互操作,本地託管在這種情況下。如果你的應用程序是本地的,那麼默認情況下不會加載CLR。您可以通過創建只在實際需要時纔在託管程序集中定義的COM對象來「延遲加載」CLR。 CLR的COM層將負責在該點加載CLR並將CCW返回給被管理對象。

+0

我試過這個,但是爲了使用COM interop,你需要使用/ clr:oldSyntax進行編譯,並且只做*獨立*導致CLR被加載,*沒有*甚至實際調用任何COM互操作>受管理DLL代碼。這聽起來像是正確的行爲嗎? – 2009-09-15 14:45:01

+0

@泄露,它不應該。如果從託管程序集中導出TLB並註冊它,則應該可以像創建其他COM對象一樣創建對象。它應該與其他COM對象的本地代碼無法區分。 – JaredPar 2009-09-15 14:49:37

+0

你說得對,但是我讀到的關於如何導入程序集TLB的TechNet文章說我必須在編譯器中設置/ clr:oldSyntax標誌。這竟然是完全錯誤的。 – 2009-09-22 15:26:08

0

我建議爲託管組件製作一個COM callable wrapper

你可以擁有自己的.NET類,並帶有可以被非託管代碼引用的接口(在我的例子中,我有傳統的ASP實例化一個.NET構建的對象)。