【发布时间】:2018-06-27 13:42:07
【问题描述】:
我正在将使用VB6 编码的旧应用程序转换为VB.NET。
在我的旧应用程序中,我使用了第三方 DLL 文件。我们就叫它ThirdParty.dll吧。
我对 ThirdParty.DLL 的一个用法就像在 VB6 中的那样:
Dim MyApi as new x.y 'referenced from the ThirdParty.dll
Dim vReturnCode as Long
vReturnCode = MyAPI.InitialiserCles(a, b, c, d, e) 'consider a,b,c,d,e variables declared and initiaited.
在旧应用程序中,这将返回一个结果为Long。
现在,我需要在我的新 VB.NET 应用程序中使用相同的 ThirdParty.dll。
我创建的是这样的:
Public Class ThirdPartyAPI
Private Declare Function InitialiserCles Lib "ThirdPartyFolder\ThirdParty" (a As String, b As String, c As String, d As String, ByRef e As String) As Long
Public Function InitializeKey(a As String, b As String, c As String, d As String, ByRef e As String) As Long
Return InitialiserCles(a, b, c, d, e)
End Function
End Class
现在当我想使用它时,我会这样做:
Dim MyApi as new ThirdPartyAPI
Dim result as MyApi.InitialiserCles(a,b,c,d,e) 'consider again variables are well declared/initiated.
我收到以下错误:
在 DLL ThirdPartyFolder\ThirdParty 中找不到 DLL 入口点“InitialiserCles”
我猜这是因为我们实际上是从那个 DLL 创建了一个 x.y 的新实例,然后调用了函数 InitialiserCles(在旧的应用程序 (VB6) 中)。我没有在VB.NET 中做同样的事情。我错过了什么?
【问题讨论】:
-
看起来 DLL 实际上是一个 COM 库。我建议您更仔细地研究原始代码,以便您理解它。同样值得查阅该 DLL 的文档。
-
我确实认为它也是一个 COM 库。我已经查看了那个 DLL 的文档,它只解释了如何在 VB6 中使用它,并且给出了函数的签名。
-
那么,如果你知道它是一个 COM 库,为什么还要使用
Declare?这不仅适用于遗留代码(p/invoke 现在是方式),它对 COM 也没有好处。我认为您需要的不是 SO 问题,而是对问题空间的一些老式研究。 -
当我尝试将它添加为 .net 项目中的引用时,我收到错误消息,指出它不是有效的程序集或 COM 组件。我想我错了。
-
您不能直接添加 VB6 DLL 作为对 .net 项目的引用。您需要一个互操作程序集来进行 COM 和 .NET 之间的对话。看看this post 是否有帮助。