C#应用程序中的多个VB6公寓

时间:2013-10-29 19:00:01

标签: c# com vb6 appdomain sta

我们有一个非常古老的遗留 vb6 应用程序,它有一个充当应用程序核心的全局对象,它存储不同的应用程序设置,调用数据库操作等等。具有不同progid的多个模块使用此全局对象,并且由于单线程单元而没有问题。

不久前创建了新的WPF应用程序,它为我们提供了从vb6的过渡,但是由于一些架构错误,它仍然受到vb6遗留的限制。每个应用程序实例只能连接一个数据库。它在包装类中保存vb6全局对象的静态实例,用作实现遗留功能的桥梁。

现在,我们正在开发不应受旧旧代码限制的新应用程序,特别是新应用程序应该能够同时连接到多个数据库,但是有一个问题:vb6代码仅限于单个数据库,所以应该有几个vb6全局对象的实例,每个数据库一个。

所以问题是:它是否可能,如果可能的话,如何在同一个C#应用程序中使用几个独立的全局vb6对象实例?

我认为这样的对象的每个实例都应该存在于它自己的 STA -Thread中,但是我不知道如何创建这样的线程,这些线程对于整个应用程序运行时保持活动并且具有assotiated wrappers,包含全局vb6对象的实例,并支持从GUI线程调用某些函数(以及如何组织这样的跨线程通信,没有thread.invoke(...))。我想到使用wpf调度程序模型(包装器类是DispatcherObject,每个实例都有它自己的Dispatcher和它自己的STA-Thread),但我看不出如何实现这样的事情。另外我认为可以通过在不同的AppDomain中加载包装类(静态)的每个实例来实现它,但我不知道它是否解决了COM的STA问题。

2 个答案:

答案 0 :(得分:1)

可以使用所谓的非托管代码。看看这个: http://www.codeproject.com/Articles/154144/Using-Unmanaged-VB6-Code-in-NET

答案 1 :(得分:1)

每个AppDomain可能会运行一个全局对象实例。

为了安全起见,你应该在每个进程中运行它们,因为这是他们创建的假设。我保证当你违反古代代码的假设时会发生可怕的事情 - 特别是当你把它们介绍给那些在写作时根本不存在的东西时。