【问题标题】:Declaring third party DLL dynamically in VB.NET在 VB.NET 中动态声明第三方 DLL
【发布时间】:2012-11-27 21:16:01
【问题描述】:

我在不同环境中导入 DLL 时遇到问题。 我必须检查Windows平台并导入将放置在C:\Program Files\32-bit)或C:Program Files (x86)\64-bit)中的第三方DLL。

之前的代码是这样写的:

Declare Function RDRCConnect Lib "c:\program files\TP-DLL\RDRCAP32.DLL" (ByVal lpszServerName As String, ByVal lNetConnType As Integer, ByVal lpszParam1 As String, ByVal lpszParam2 As String, ByVal lpszParam3 As String, ByRef lNetConn As Integer, ByRef lNetErr As Integer) As Integer  
Declare Function RDRCDisconnect Lib "c:\program files\TP-DLL\RDRCAP32.DLL" (ByVal lNetConn As Integer, ByRef lNetErr As Integer) As Integer

...我改为使用属性:

Private Const CheminDLL As String = "C:\Program Files\TP-DLL\RDRCAP32.DLL"

<System.Runtime.InteropServices.DllImport(CheminDLL)>
Private Shared Function RDRCConnect(ByVal lpszServerName As String, ByVal lNetConnType As Integer, ByVal lpszParam1 As String, ByVal lpszParam2 As String, ByVal lpszParam3 As String, ByRef lNetConn As Integer, ByRef lNetErr As Integer) As Integer
End Function

一旦 DLLImport 需要一个常量作为参数,我如何在这种情况下动态更改 DLL 路径?

【问题讨论】:

    标签: vb.net dll import


    【解决方案1】:

    除了常量之外,没有其他方法可以将任何东西传递给属性,因为根据定义,属性是在编译时评估的,而不是在运行时评估的。可能有更好的选择,但我可以给你的一个选择是为每个版本创建单独的导入:

    <DllImport("C:\Program Files\TP-DLL\RDRCAP32.DLL", EntryPoint := "RDRCConnect")>
    Private Shared Function RDRCConnect32(ByVal lpszServerName As String, ByVal lNetConnType As Integer, ByVal lpszParam1 As String, ByVal lpszParam2 As String, ByVal lpszParam3 As String, ByRef lNetConn As Integer, ByRef lNetErr As Integer) As Integer
    End Function
    
    <DllImport("C:\Program Files (x86)\TP-DLL\RDRCAP32.DLL", EntryPoint := "RDRCConnect")>
    Private Shared Function RDRCConnect64(ByVal lpszServerName As String, ByVal lNetConnType As Integer, ByVal lpszParam1 As String, ByVal lpszParam2 As String, ByVal lpszParam3 As String, ByRef lNetConn As Integer, ByRef lNetErr As Integer) As Integer
    End Function
    

    然后,您需要在每次调用该方法时选择适当地调用哪一个。

    【讨论】:

    • 谢谢史蒂文!我只是将 EntryPoint 运算符更改为 := 而不是 = :)
    • 糟糕!我在答案中修复了它。
    【解决方案2】:

    几天前我偶然发现了这个问题,当时我遇到了与您类似的问题,这让我走上了正确的道路。寻找它here

    【讨论】:

    • 嗨贾斯汀,感谢您的回复!稍后我将尝试您和 tcarvin 的建议。再次感谢!
    【解决方案3】:

    如果 dll 相同(相同的名称和签名)但只是在不同的位置,那么您可以使用在运行时确定的 dll 的完整路径显式地 p/invoke LoadLibrary。只要您在调用任何导出的 API之前执行此操作,那么只要导入中的 dll 名称相同,它将使用已加载的 API。

    【讨论】:

    • 感谢您的帮助 tcarvin!是的,DLL 是相同的,它们只是位于不同的位置。我稍后会尝试实现它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2013-08-29
    • 2016-08-04
    • 2023-04-01
    • 2021-12-06
    • 1970-01-01
    • 2017-10-18
    相关资源
    最近更新 更多