2012-11-27 5 views
3

다른 환경에서 DLL을 가져 오는 중에 문제가 있습니다. Windows 플랫폼을 확인하고 C:\Program Files\ (32-bit) 또는 C:Program Files (x86)\ (64-bit)에 배치 할 타사 DLL을 가져와야합니다.VB.NET에서 제 3 자 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 

... 내가 속성을 사용하도록 변경 : 나는 일단,이 시나리오에서 dinamically는 DLL 경로를 변경할 수있는 방법

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는 상수를 매개 변수로 사용합니까?

답변

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 

그런 다음 당신은 당신이 메소드를 호출 할 때마다 적절하게 호출 할 수있는 하나를 선택해야합니다.

+0

감사합니다 스티븐! 방금 EntryPoint 연산자를 다음으로 변경했습니다. = = 대신 = :) – Nando

+0

죄송합니다! 나는 대답으로 그것을 고쳤다. –

0

나는 당신에게 비슷한 문제가 생겼을 때 이틀 전에 비틀 거리며 나를 올바른 길로 인도했습니다. 그것을 찾으십시오 here.

+0

안녕 저스틴, 답장을 보내 주셔서 감사합니다! 나는 나중에 당신과 tcarvin 모두 제안을 시도 할 것입니다. 다시 한 번 감사드립니다! – Nando

0

dll이 동일하지만 (동일한 이름 및 서명) 서로 다른 위치에있는 경우 런타임에 결정된 dll의 전체 경로를 사용하여 LoadLibrary을 명시 적으로 p/호출 할 수 있습니다. 이 작업을 수행하는 동안에 전에 사용자가 내 보낸 API를 호출하면 가져 오기에서 dll의 이름이 같으면 이미로드 된 API가 사용됩니다.

+0

도움 주셔서 감사합니다 tcarvin! 그렇습니다. DLL은 동일하며 서로 다른 위치에 있습니다. 나는 이것을 나중에 구현하려고 노력할 것이다. – Nando

관련 문제