2012-07-19 106 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