Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
逐步将大型单片VB6 winforms应用程序的各个部分重构到.Net_.net_Vb6_Vb6 Migration - Fatal编程技术网

逐步将大型单片VB6 winforms应用程序的各个部分重构到.Net

逐步将大型单片VB6 winforms应用程序的各个部分重构到.Net,.net,vb6,vb6-migration,.net,Vb6,Vb6 Migration,简而言之,该应用程序从数据库中查找某项操作的指令,执行该操作,并将该操作的成功或失败信息保存回数据库。它执行大约40种不同的操作,如自动化办公应用程序、复制文件、运行搜索等 该应用程序是一个单一的EXE,因此所有程序都在主应用程序的进程空间中运行,这一直是不稳定的主要原因,因为它必须加载大量第三方DLL来完成这项工作,而且它们经常会做一些令人不快的事情,导致整个应用程序崩溃 计划:我想将执行危险繁重操作的代码从VB6 exe中移出,并移入独立于主应用程序运行的外部进程。最初的应用程序将只处理数据

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

该应用程序是一个单一的EXE,因此所有程序都在主应用程序的进程空间中运行,这一直是不稳定的主要原因,因为它必须加载大量第三方DLL来完成这项工作,而且它们经常会做一些令人不快的事情,导致整个应用程序崩溃

计划:我想将执行危险繁重操作的代码从VB6 exe中移出,并移入独立于主应用程序运行的外部进程。最初的应用程序将只处理数据库的东西,并启动其他进程来完成它的出价

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

最好的办法是什么


谢谢

在您的情况下,生成另一个进程(通过控制台应用程序或其他方式)可能不是一个好主意。你必须担心与这个过程的沟通,这可能是一个真正的麻烦,而且这并不能真正为你带来任何稳定性。我可能会做的是使用VB.NET创建一个使用线程的COM可见类库


这将使您能够在.NET库中的后台工作,并且只要您对异常管理(在.NET库中)保持谨慎,就不会真正影响VB6应用程序。VB6应用程序可以等待.NET库完成繁重的工作,并向它发送一条友好的消息。

Hm,不能说我以前尝试过类似的方法,但是

一种可能的解决方案

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

    另一种选择是使用Windows工作流基础4。它相对稳定且易于使用(我自己也涉猎过)。我不知道它是否提供了您所需要的隔离,但值得一看

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

    另一种可能的解决方案


    另一种可能有点笨手笨脚,但在单进程托管方面更为传统并提供所需隔离的替代方案是查看[MAF](查看链接中有关隔离级别的部分)。这可能有点吓人,但我的朋友,如果你把事情简单化,它可能会扭转局面。

    谢谢斯科特。我试图避免的最糟糕的错误是,当第三方dll中的代码导致内存访问冲突,并且主机应用程序消失时,VB6中的错误处理程序甚至从未触发。您所描述的解决方案是否提供了更好的保护,以应对此类问题?遗憾的是,可能没有。在这种情况下,生成另一个进程可能是唯一真正的方法。您可以创建一个控制台应用程序,用于写入硬盘上的日志文件。然后可以从VB6中查看此文件。WCF也可以工作。您可以编写一个.NET COM可视类库来调用WCF服务,因为您不能直接从VB6调用WCF。我不是说您根本不能从VB6调用WCF服务,它只涉及使服务RESTful和使用VB6发出一些HTTP GET请求等。“您可以编写一个.NET COM可见类库来调用WCF服务,因为您实际上无法直接从VB6调用WCF“-现在很明显!谢谢斯科特,这是我要尝试的方向。谢谢约翰尼。我想WCF可能会在其中扮演一个角色。如何将一个VB6应用程序连接到WCF服务中?嗯,我不是vb专家,但我相信有很多例子[在这里和其他地方]可以帮助您开始使用。另外两分钱:我总是发现在简单的米老鼠应用程序中检查和研究对我来说是新的方法和技术很有帮助。一旦我了解了这项新技术的工作原理,我就开始研究如何应用它。试一试:)再次感谢,很好的建议-我将首先在沙箱中解决它。别担心,巴克-刚刚意识到vb6没有得到管理,也没有意识到存在互操作问题。希望这有点帮助,祝你好运!:)