3

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

在代码写成这样之前:

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 路径?

4

3 回答 3

3

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

<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

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

于 2012-11-27T21:31:24.667 回答
0

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

于 2012-11-27T21:30:09.940 回答
0

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

于 2012-11-27T21:51:47.563 回答