2012-07-19 84 views
0

我們在Visual Basic .NET中開發了一個相當健壯的程序,並且我們創建了一個實質上代表整個程序作爲單個對象的API。這工作得很好,我們已經使用了很多年 - 但現在一個項目出現了,我們真的可以使用它的多個實例。多實例化廣泛使用全局變量的項目

問題是代碼庫對啓動模塊中的全局變量(gSvcMgr)有廣泛的引用。我怎樣才能讓這個對象的多個實例引用一個不同的變量?我可以使用命名空間嗎?或Shadows關鍵字?

我可以進一步描述結構,如果我一直不清楚,或者如果具體可能有所幫助。

雖然重構全局變量是不可能的,但如果它是唯一的選擇,我們有一個非常大的代碼庫,只有少數開發人員。

謝謝!

+0

Um ...在自己的線程上創建對象的每個實例,並將所有全局變量標記爲[thread-static](http://msdn.microsoft.com/zh-cn/library/system.threadstaticattribute( v = VS.90)的.aspx)? – GSerg 2012-07-19 23:57:57

+0

不知道你爲什麼不把這個標記爲答案,但謝謝你的建議。我無法確定這是否適用於模塊變量,但我明天會到辦公室試試看。 – FellowMD 2012-07-20 03:27:36

+0

我只是沒有做出這個答案,因爲我完全不確定它會起作用,甚至不推薦它。 – GSerg 2012-07-20 09:00:06

回答

1

您可以使用AppDomain.CreateInstanceAndUnWrap在單獨的Application Domain中創建應用程序對象的每個實例。這將創建選項的每個實例,它是一個不同的域,它將擁有自己的共享全局數據副本,並且不會互相觸及。

然而,使用應用程序域會帶來性能成本 - 應用程序域之間的所有方法調用將爲marshaled(已閱讀複製)。您還必須從MashalByRefObject派生您的應用程序對象。

查看此blog post瞭解如何使用應用程序域來解決與您相似的問題。

+0

哦,這可能是非常有用的。這個問題很可能只適用於這個單一的項目,所以我不認爲性能受影響太大。我會先給GSerg的quick-fix一個鏡頭,看看如果我有麻煩,這可以爲我做些什麼。感謝您的明確答覆和所有參考! – FellowMD 2012-07-20 03:30:59

+0

我剛剛做了重構。這可能是我找到的最好的選擇,所以感謝指針。你得到支票(是唯一的答案,並且是一個很好的建議) – FellowMD 2012-08-10 18:55:56