在VB.NET中动态声明第三方DLL

时间:2012-11-27 21:16:01

标签: vb.net dll import

我在不同环境中导入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期望Constant为参数,我怎样才能在这种情况下改变DLL路径?

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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