2017-06-30 45 views
0

我在我的項目中使用第三方庫。我的項目也有一個插件系統,允許用戶創建在運行時動態加載自己的插件:從兩個外部庫引用的靜態類 - 每個都可以看到它是「自己的」版本?

var plugin = Assembly.LoadFrom(pathToPluginDLL); 
// later on, the constructor from the user plugin is loaded 
pluginConstructor.Invoke(); 

我有一個場景,這些用戶的插件之一引用相同的第三方庫,我的主要項目使用。該第三方庫具有一個靜態對象,該靜態對象對於主項目而言必須是唯一的,並且對於用戶插件來說是唯一的。

這裏發生了什麼快速做作的代碼示例:

// This is a class within a 3rd party DLL, referenced directly from the main project 
public class SomeClassWithStaticObjects 
    public static string staticString {get; set;} 
} 

// In the main project 
SomeClassWithStaticObjects.staticString = "main project static string"; 

在引用同一個第三方DLL的用戶插件之一:

SomeClassWithStaticObjects.staticString = "plugin project static string"; 

的問題在於SomeClassWithStaticObjects.staticString被引用主項目和使用反射加載的插件之間的相同靜態對象。有沒有一種方法可以將用戶插件「隔離」在自己的內存空間中,以便它擁有自己獨特的靜態類版本?

+0

非靜態對象:) ie ....避免全局變量 –

+0

這是什麼問題(如果不解決,結果不好)? –

+0

您可以嘗試使用適配器模式對其進行包裝。這有助於使所有這些外部對象在您的代碼中看起來更加正交。這將促進您的應用程序本身內更統一的代碼集,我希望... – code4life

回答

3

如果靜態類在單獨的application domains中,您可以有兩個單獨的靜態類實例。

這裏有很多可能過時的文檔。 Here's something a little more recent

This answer也可能有所幫助。

我真的好奇這個庫是什麼造成了這個問題。它似乎沒有關係。

+0

「唯一」顯然是錯誤的,因爲只要您設法從不同的地方加載它們(即從GAC加載),就可以擁有儘可能多的強類型版本,否則實際上單獨的appdomains是很好的解決方案。 –

相關問題