1

我正在用 VB.Net 中重写的对应物替换 VB6 应用程序。
在 VB6 应用程序中有一个“控制”应用程序,它向用户呈现一个表单并允许他们从下拉列表中选择一个“客户端”。选择客户端会导致读取设置客户端特定参数的 ini 文件,包括几个 dll 的程序名称,这些 dll 也是用 VB6 编写并在主题机器上注册的。

例如,每个“客户”都有不同的信函格式,而信函是由选定的 dll 编写的。这使得一切都变得迟到,但只有一个用户。最重要的是,通过只更新那个 dll 并将 dll 放在旧的上面,它可以方便地不断更新单个字母。因此,(文书)用户只需要被告知将此文件保存到通常的文件夹中。我本可以在一个 exe 中编译所有内容,从而使我的更新更大更复杂。

在 VB.Net 中重新执行此操作时,我应该如何替换这种方法?

  1. 我可以将所有内容整合到一个大项目中(并将其编译为 exe,这是我避免的大型更新)。我应该这样做吗?

  2. 如果我继续使用单独编译客户端特定 (.net) dll 的方法,这在 .Net 世界中有意义吗?我怎么称呼他们?他们需要像以前一样注册吗?优点缺点?

  3. 什么是正确的方法来做到这一点,并且仍然给我我所拥有的灵活性?

4

4 回答 4

1

我可以立即想到几种方法来为您提供这种功能。

  1. 使用反射并在运行时动态加载程序集。(这是有据可查的,并不像看起来那么难。)
  2. 使用 IoC 容器,例如 Microsoft Enterprise Library 中的 Unity。
  3. 使用 MEF 框架。(也来自微软)
  4. 为每组模板使用一个资源文件。

IoC 容器可以为每个用户使用不同的容器来实现,每个容器连接不同的程序集。而且我认为会更好地满足您的要求。

我还没有机会查看 MEF,但我认为这与 Unity 相同,但使用属性而不是配置来进行接线。这可能会阻止您动态更改模板。

使用资源文件系统可以工作并且非常容易加载,但是您将无法在模板中包含代码,这可能会或可能不会成为问题,具体取决于 VB6 类目前实际在做什么。

当然,您根本无法重写 VB6 模板,而只能使用 COM 互操作来访问它们。但是你仍然需要支持 VB6 代码,可能不是你所追求的。

于 2009-07-22T20:22:03.750 回答
1

我会为你的信函模板建立一个基于文本的格式。这样您就不必在每次模板更改时都编译一些东西。但是,如果您真的想动态加载这样的 dll,您可以使用System.Addin命名空间或使用反射来实现Activator.CreateInstance(),让您在 dll 中关心的类型实现特定接口并使用特定属性标记它们。

于 2009-07-22T20:15:50.270 回答
0

一些很好的答案,但我可以给一些建议吗?一定要确保重写是正确的举措。乐观地开始重写大型应用程序,在修复旧架构中的缺陷方面取得良好进展,然后陷入重复多年来认为理所当然的功能,这是一个常见的陷阱。在这一点上,一切都变得非常不舒服,项目经常失败。

来自Microsoft UK 网页的官方建议。

对 .NET 执行完全重写要比将 VB6 半自动转换为 VB.NET 成本高得多且难以做好……我们只在少数情况下推荐这种方法。

以及来自微软员工博客的引述:

我在 .NET 早期工作过的许多公司首先考虑重写,部分原因是在迁移到 .NET 的同时,他们强烈希望改进底层架构和代码结构。不幸的是,其中许多项目遇到了困难,有几个项目从未完成。他们试图解决的问题太大了。

话虽如此,有些人确实成功地用 .NET 重写了 VB6 应用程序,并且对结果非常满意。但请先考虑清楚。

于 2009-07-23T09:21:55.070 回答
0

全局程序集缓存承担了注册表在 COM 中所扮演的一些角色。

于 2009-07-24T04:02:24.397 回答