vb6到vb.net dll兼容版本

时间:2015-07-06 13:11:03

标签: .net vb.net dll vb6 vb6-migration

我解释了我的问题:

我在vb6中有一些程序(5-6),在vb6中有很多DLL。 我们将在Vb.Net中执行这些DLL和程序的迁移。

我们想从DLL开始,每个程序引用2或3个DLL。

我想在vb.net中执行DLL的迁移(没问题)但是我希望保持旧的vb6 DLL和vb.net中的新DLL之间的(二进制)兼容性 因为没有它,我将不得不使用此DLL重新构建每个应用程序,因为兼容性已被破坏。

我搜索了很多,我试图采用vb6类的GUID并在VB.NET中强制它使用类似的东西:

<Guid("B3F3EF24-F6E8-4XF9-A686-824DXXX2DF0")>
<ProgId("Project.ClsObj")>
 Public Class ClsObj
 ....

并选择:使程序集COM-Visible

但即便如此,如果我部署vb.net DLL(与vb6 DLL的名称相同)并使用regasm注册它:该程序无法正常工作。

如果你有一些想法,我会很感激 我不知道我想做的事情是否真的可能

Thks

1 个答案:

答案 0 :(得分:5)

是的,这还不够。最好的方法是使用OleView.exe实用程序,从Visual Studio命令提示符运行它。使用文件&gt;查看TypeLib并首先选择您的VB6 DLL。您将在右侧窗格中看到类型库的内容。将其复制/粘贴到文本编辑器中,这是您的.NET版本需要完全匹配的“主”。使用文件&gt;再次查看Typelib,这次选择.NET .tlb文件进行比较。

首先需要注意的是接口,这是VB6中完全不可见的细节。接口的[uuid]必须匹配,现在它不匹配。您可以保留现在的编程风格,而不是明确声明接口,但必须使用Microsoft.VisualBasic.ComClassAttribute。它允许您指定已有的类的[Guid],但接口的[Guid]。一个用于[默认]接口,另一个用于[source]接口(如果有)。

下一个细节是类型库的uuid和版本号,也可以从[library]块顶部的OleView中看到。使用项目&gt;属性&gt;申请&gt;装配信息按钮。复制guid并设置AssemblyVersion的前两个数字以匹配。

接下来,您需要仔细比较OleView的VB6和.NET输出,并验证接口成员的顺序和参数是否完全匹配。小错误导致很难诊断运行时故障。意外省略或交换两个成员会导致VB6调用完全错误的.NET方法。争论错误导致堆栈不平衡。

有一种更好的方法可以确保这不会出错,您实际上可以在VB.NET项目中使用VB6类型库中的接口声明。项目&gt;添加新参考&gt;浏览按钮/标签&gt;选择VB6可执行文件。那么你的课应该类似:

<ComVisible(True)> _
<ClassInterface(ClassInterfaceType.None)> _
<Guid("B3F3EF24-F6E8-4XF9-A686-824DXXX2DF0")> _
<ProgId("Project.ClsObj")> _
Public Class ClsObj
    Implements _ClsObj

    '' etc..
End Class

其中_ClsObj是您在OleView输出中找到的接口的名称。这样做的一大优点是,您可以完全确定您的类可以从现有的VB6代码中安全地使用。当你逐步增加一个VB6可执行文件时,这当然很重要。

缺点是您保持对VB6类型库的依赖。务必将其检入源代码管理中。你最终可以使用像Reflector或ILSpy这样的反编译器来摆脱它。要求它反编译接口类型并将其复制/粘贴到VB.NET源文件中。之后,您可以删除装配参考。

相关问题