3

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

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

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

所以问题是:有没有可能,如果有,怎么可能在同一个 C# 应用程序中使用多个独立的全局 vb6 对象实例?

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

4

2 回答 2

1

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

于 2013-10-29T19:40:51.850 回答
0

您可能会在每个AppDomain.

为了安全起见,您应该在各自的进程中运行它们,因为这是创建它们的假设。我向您保证,当您违反古代代码的假设时,可能会发生可怕的事情——尤其是当您将它们介绍给编写时根本不存在的事物时。

于 2013-10-30T02:39:18.647 回答