VB6到VB.Net-如何替换注册的DLL概念

我用VB.Net中的重写对象替换了VB6应用程序。
在VB6应用程序中,有一个“控制”应用程序向用户呈现了一个表单,并允许他们从下拉列表中选择一个“客户机”。选择一个客户端导致读取一个ini文件,该文件设置客户特定的参数,包括多个dll的程序名,这些dll也写在VB6中并在主机上注册。 例如,每个“客户端”具有不同的字母格式,并且该字母是由选定的dll编写的。这使得所有事情都迟到了,但只有一个用户。最重要的是,它可以方便地不断更新单个字母,方法是只更新该dll,然后将dll放在旧的dll上。因此,(文书)用户只能被告知将该文件保存到通常的文件夹中。我可以在一个exe文件中编译所有内容,使我的更新变得更大更复杂。 在VB.Net中重新做这个,我应该如何替换这种方法?

  1. 我可以把所有东西都捆绑在一个大项目中(并将它编译成一个exe,这是我避免的大型更新)。我应该这样做吗?
  2. 如果我继续采用分开编译我的客户特定(.net)dll的方法,这对于.Net世界是否有意义?我如何给他们打电话?他们是否需要像以前一样注册?优点,缺点?
  3. 做到这一点的正确方法是什么,仍然给我灵活性?
已邀请:

et_est

赞同来自:

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

fearum

赞同来自:

有几种方法,我可以立即想到给你这种功能。

  1. 使用反射并在运行时动态加载程序集。 (这是有据可查的,并不像看起来那么难。)
  2. 使用Microsoft企业库中的IoC容器(如Unity)。
  3. 使用MEF框架。 (也来自Microsoft)
  4. 为每组模板使用资源文件。
IoC容器可以为每个用户使用不同的容器来实现,每个容器连接不同的组件。我认为会更好地满足您的要求。 我还没有机会看看MEF,但我认为它和Unity一样,但是使用属性来完成接线而不是配置。这可能会阻止您动态更改模板。 使用资源文件系统可以工作,并且相对容易加载,但是您将无法在模板中包含代码,这可能会或可能不会成为问题,具体取决于VB6类目前实际正在执行的操作。 当然,你根本无法重写VB6模板,只是使用COM互操作来访问它们。但是,那么你仍然需要支持VB6代码,可能不是你所追求的。

a_et

赞同来自:

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

Performing a complete rewrite to .NET is far more costly and difficult to do well [than converting VB6 to VB.NET semi-automatically] ... we would only recommend this approach for a small number of situations.
以及来自a Microsoft employee's blog的报价:
Many companies I worked with in the early days of .NET looked first at rewriting driven in part by a strong desire to improve the underlying architecture and code structures at the same time as they moved to .NET. Unfortunately many of those projects ran into difficulty and several were never completed. The problem they were trying to solve was too large.
话虽如此,some people在.NET中成功地重写了VB6应用程序,并对结果非常满意。但是要先思考。

lmagni

赞同来自:

Global Assembly Cache具有注册表在COM中扮演的角色。

要回复问题请先登录注册