逐渐重构一个巨大的,单片的VB6 winforms应用程序到.Net

时间:2010-07-16 13:31:35

标签: .net vb6 vb6-migration

简而言之,应用程序从数据库中查找要执行的操作的指令,执行操作,并将有关该操作成功或失败的信息保存回数据库。它执行大约40种不同的操作,例如自动化Office应用程序,复制文件,运行搜索等。

应用程序是一个单独的EXE,所以一切都在主应用程序的进程空间中运行,并且一直是不稳定的主要来源,因为它必须加载许多第三方DLL来完成工作,他们经常会做一些令人讨厌的事情这会使整个应用程序崩溃。

计划:我想将执行危险繁重的代码移出VB6 exe并进入独立于主应用程序运行的外部进程。原始应用程序将只处理数据库内容并启动其他进程来进行出价。

最好的方法是什么?如果我还在VB6中,我想我会构建ActiveX EXE来做到这一点,但我不确定.Net等价物是什么。理想情况下,VB6应用程序将声明一个实例化外部进程的对象,并使用对象集参数的方法,执行该进程,可能接收进度通知,最后接收操作结果。

最好的方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

嗯,不能说我之前尝试过这样的事情,但是

一种可能的解决方案

  1. 编写一个应用程序\服务,a)生成子进程,b)托管WCF service以促进进程之间的通信
  2. 编写子流程以处理“操作”
  3. 另一种可能的解决方案

    替代可能使用Windows Workflow Foundation 4.它相对稳定且相对容易使用(我自己也涉足过)。我不知道它是否提供了您需要的隔离,但值得一看。

    您基本上可以创建自己的自定义活动来执行操作,然后通过WorkflowInvoker动态执行它们。

    另一种可能的解决方案

    另一种可能有点沉重的替代方案,但在单进程托管方面更为传统,并提供您所需的隔离,可以查看Managed Add-in Framework [MAF](查看链接的部分)关于隔离级别)。这可能有些令人生畏,但是我的朋友Kent Boogaart has done some nifty things with it,如果你保持简单,它可能会变成诡计。

答案 1 :(得分:-1)

在你的情况下,产生另一个进程(通过控制台应用程序或其他)可能不是一个好主意。你不得不担心与这个过程进行沟通,这可能是一个真正的麻烦,并不是真的会给你带来任何稳定性。我可能会做的是使用VB.NET创建一个使用BackgroundWorker线程的COM-Visible类库。

这将使您能够在.NET库中的后台工作,只要您小心处理异常管理(在.NET库中),它就不会真正影响VB6应用程序。 VB6应用程序可以等待.NET库执行繁重的工作并为其提供友好的友好消息。