vb6 到 vb.net dll 兼容版本

vb6 to vb.net dll compatibility version

我解释一下我的问题:

我在vb6中有一些程序(5-6),在vb6中有很多DLL。 我们将在 Vb.Net.

中执行这些 DLL 和程序的迁移

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

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

我搜索了很多,我试图获取 vb6 class 的 GUID 并用类似 :

的东西强制它进入 VB.NET
<Guid("B3F3EF24-F6E8-4XF9-A686-824DXXX2DF0")>
<ProgId("Project.ClsObj")>
 Public Class ClsObj
 ....

并添加选项:使程序集 COM 可见

但即便如此,如果我部署 vb.net DLL(与 vb6 DLL 同名)并使用 regasm 注册它:程序无法运行。

如果你有什么想法,我将不胜感激 我不知道我想做的事情是否真的可行

感谢

是的,这还不够。最好的方法是使用 OleView.exe 实用程序,运行 它来自 Visual Studio 命令提示符。首先使用 File > View TypeLib 和 select 你的 VB6 DLL。您将在右窗格中看到类型库的内容。 Copy/paste 将其放入文本编辑器,这是您的 "master" 您的 .NET 版本需要完全匹配。再次使用“文件”>“查看类型库”,这次 select正在比较 .NET .tlb 文件。

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

下一个详细信息是类型库的 uuid 和版本号,也可以从 [library] 块顶部的 OleView 中看到。使用 Project > Properties > Application > Assembly Information 按钮。复制 guid 并将 AssemblyVersion 的前两个数字设置为匹配。


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

有一个更好的方法来确保这不会出错,您实际上可以在 VB.NET 项目中使用 VB6 类型库中的接口声明。项目 > 添加新引用 > 浏览 button/tab > select VB6 可执行文件。您的 class 应该类似于:

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

    '' etc..
End Class

其中 _ClsObj 是您在 OleView 输出中找到的接口的名称。这样做的一大优势是您可以完全确定您的 class 始终可以从现有的 VB6 代码中安全地使用。当您逐步执行此操作时,哪一个当然很重要,一次替换一个 VB6 可执行文件。

缺点是你对VB6类型库有依赖。请务必将其签入源代码管理。您最终可以使用 Reflector 或 ILSpy 等反编译器摆脱它。要求它反编译接口类型并将其 copy/paste 到您的 VB.NET 源文件中。之后您可以删除程序集引用。