0

我们正在使用我们公司的一个主要软件,它是用 VB6 编写的,并且太大而无法迁移。此外,我们还有一些仍在使用的旧 Windows XP PC(没有争议,这不是我的决定)。我们想通过使用 VB.NET 程序集向我们的 VB6 程序添加新功能。这对于 Win Vista 及更高版本运行良好,但 XP 的行为不正常。

我尝试过的:我在 VB .NET 中创建了一个类库。使其成为 COM-Visible 并将其注册为 com-interop。我的目标是 .NET Framework 4.0(也试过 2.0)然后我创建了一个带有简单函数的简单类,用于测试目的:

Imports System.Runtime.InteropServices
<Guid("b98ddfd4-f6bc-40d4-85eb-5bd45c272325")> _
Public Interface Class1_Interface
Function MyFunction(ByVal MyParam As String) As Boolean
End Interface

<Guid("0bbee3db-88e3-4089-adc1-f5a0cf9e1fda")> _
<ClassInterface(ClassInterfaceType.None)>
Public Class Class1 : Implements Class1_Interface

Public Function MyFunction(ByVal MyParam As String) As Boolean Implements Class1_Interface.MyFunction
Try
MyFunction = True
Catch ex As Exception
MyFunction = False
Dim FunctionName As String = System.Reflection.MethodBase.GetCurrentMethod().Name
End Try

End Function
End Class

我已经为 X86 编译了它。

然后我在 VB6 中添加了对它的引用,并在 VB6 中使用了这个简单的代码

Private Sub Form_Load()
Dim x As New Class1
MsgBox (x.MyFunction(""))
End Sub

然后我创建了一个清单并将其嵌入: mt.exe -managedassemblyname:testDLL.dll -nodependency -out:testDLL.manifest mt.exe -manifest testDLL.manifest -outputresource:testDLL.dll;#1

然后,我为 exe 创建了一个清单,其中仅包含最基本的必要信息(Type="win32"、名称、版本、处理器架构和一个带有名称、处理器架构和版本的程序集块)和一个带有 (我的 Framework 2.0 dll 遇到了同样的错误,所以这应该无关紧要)

当我在高于 XP 的任何环境中执行我的 VB6 exe 时,一切正常。当我在 XP 上尝试时,出现运行时错误“429”Activex 组件无法创建对象

奇怪的是,我有一个更复杂的 dll 以完全相同的方式创建,只是具有更多功能,使用报表查看器和 sql。然而这个复杂的 dll 工作正常。我能找到的唯一相关区别是它使用 WinForm 作为类。不知道为什么这会有所作为,但正如我所说,声明接口和类、创建清单和诸如此类的方式都是相同的。

我不知道该怎么办了。我不知道是什么让那个单一的 DLL 工作而其他一切都没有。

4

0 回答 0