2009-10-28 43 views
0

我知道如何基於Mono分支代碼(Type.GetType(「Mono.Runtime」)!= null),但即使Mono代碼路徑爲採取,單聲道試圖加載非單聲道代碼路徑所需的程序集。這並不令人驚訝,但我該如何解決這個問題?我試過把電話打到另一個班的非單人大會上,但這並沒有幫助。如何防止在Mono中運行某個程序集時引用

回答

2

直接做到這一點的唯一選擇就是一路反射,就我所見。

我建議一個更迂迴的方法:將所有依賴於Mono或.NET的代碼重構爲單獨的程序集,每個平臺一個 - 讓我們稱它們爲MA和NA。確保你的類的整個API表面被通用接口覆蓋,這應該在第三個程序集IA中。之後,您的主應用程序將IA引用爲接口,並且僅使用Reflection來加載MA或NA,具體取決於它是在Mono還是.NET上運行,並獲得「頂級工廠類」的實例。一旦出現,它就會使用通過IA接口的普通調用來通過該工廠實例化所有其他對象並使用它們。

0

不要在命令行編譯器選項中添加引用。如果您使用的是高級IDE工具,那麼您可能需要使用其項目設置來實現相同的功能。 還有其他一些文件也會像AssemblyInfo.cs一樣發揮作用,並且可能包含有關您正在考慮的程序集的說明。此外,該程序可能使用來自App.Config(配置文件)或Web.Config(ASP.NET)/動態類型加載的類型。

+0

我正在使用Visual Studio進行編譯,而不是使用Mono進行編譯。 – Fantius 2009-10-28 20:32:10

0

不要依賴於您的依賴關係,因爲您的代碼已被打亂並且僅調用了被調用的代碼。

最好總是假設,無論引用什麼都會被加載並且必須可用。 您的用戶可能會選擇使用AOT,這是Mono的NGEN副本。 新版運行時版本處理諸如序列化,遠程處理,安全性,反射等方面的細微差別可能導致您的引用被加載,即使您的代碼不直接使用任何東西。 (但是序列化程序可能已經拉取了所有類型,然後加載了其他程序集)

使用接口或經典繼承,或者可能是事件或其他間接方式來僅在適當時加載.Net部件。而我的意思是一個你不參考但是動態加載的程序集。

1

擴展Pavel的答案,你可以使用插件框架來幫助加載特定於平臺的代碼位的條件。您可以使用Mono.Addins或MS自己的開源Managed Extensibility Framework(MEF)(http://www.codeplex.com/MEF

相關問題