【问题标题】:How to create a new instance of a class from a DLL?如何从 DLL 创建类的新实例?
【发布时间】: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 是否有帮助。

标签: vb.net dllimport


【解决方案1】:

自从我第一次使用 COM DLL 和其他东西以来,这对我来说并不容易。感谢上面的 cmets 我能够做到。

最后对我有用的是下一个:

由于 ThirdParty.DLL 是 COM DLL,我必须使用 regsvr32 命令注册它。 请注意,我必须使用位于SysWOW64 中的那个才能工作。 显然因为它是一个 32 位 DLL 文件。那么命令是:

regsvr32 "FullPath\ThirdParty"

成功运行此命令后,我可以在 Visual Studio 中添加来自名为 ThirdParty 的 com 对象的引用,然后我可以从该 DLL 创建类的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多