2017-04-09 1 views
0

다른 하드웨어 장치에 액세스하는 동일한 API를 사용하는 두 개의 DLL이 있습니다 (나를 만들었습니다). 컴퓨터에서 어떤 하드웨어가 감지되었는지에 따라 런타임에 그 중 하나를 선택하고 싶습니다.런타임에 동일한 API를 사용하여 두 dll 중 하나를 선택하는 방법은 무엇입니까?

windows 함수 LoadLibrary을 사용하여 DLL에서 함수를 호출하기 전에 두 라이브러리 중 하나를로드 할 수 있고 VB가로드 된 라이브러리를 사용한다는 것을 알았지 만 파일 이름이 기능 Declare (또는 Dllimport), 즉 두 dll 버전 모두 동일한 파일 이름을 가져야합니다. 그리고 이것은 dll이 동일한 디렉토리 (예 : System32 디렉토리)에 위치 할 수 없다는 것을 의미합니다.

런타임시 VB.NET 선택 항목에 동일한 API를 제공하는 두 개의 서로 다른 파일 이름을 가진 두 개의 DLL이있을 수 있습니까?

답변

0

compilation constants 이외의 조건부 가져 오기는 실제로 할 수 없습니다. 그러나 당신은 dll을 모두 가져올 수 있고 당신의 상태에 따라 둘 중 하나를 호출하는 방법을 만들 수 있습니다. 같은

뭔가 : 조언을

<DllImport("firstversion.dll", EntryPoint:="GetDevice")> _ 
Public Shared Function GetDevice_v1(ByVal arg1 As IntPtr, ByVal arg2 As String) As IntPtr 
End Function 

<DllImport("secondversion.dll", EntryPoint:="GetDevice")> _ 
Public Shared Function GetDevice_v2(ByVal arg1 As IntPtr, ByVal arg2 As String) As IntPtr 
End Function 

Public Shared Function GetDevice(ByVal arg1 As IntPtr, ByVal arg2 As String) As IntPtr 
    If condition Then 
     Return GetDevice_v1(arg1, arg2) 
    Else 
     Return GetDevice_v2(arg1, arg2) 
    End If 
End Function 
+0

감사합니다. DLL 중 하나가 이미 릴리스되고 사용 중이며 교체해야하기 때문에 이와 같은 것을 사용하지 않기 위해 노력하고있었습니다. 나는 선택의 여지가 없을지도 모른다 ... –

+0

@ FreddyBen-Zeev : 나는 다른 방법이 없다고 생각한다. 이런 식으로하는 것이 잘못된 이유는 무엇입니까? 왜 DLL 중 하나를 교체해야합니까? -이 방법을 사용하는 유일한 요구 사항은 DLL에 다른 이름을 사용하는 것입니다. ** 또는 ** _ 다른 폴더에 배치하십시오. –

+0

@ FreddyBen-Zeev : 안녕하세요! 어떻게 당신을 위해, 당신은 어떤 진전이 있었나요? 내 대답이 문제를 해결 한 경우 내 게시물 왼쪽의 체크/체크 표시를 눌러 해당 내용을 "수락 됨"으로 표시하십시오. 자세한 내용은 다음을 참조하십시오. [** 답변 수락 방법은 무엇입니까? **] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –

관련 문제