문제

MSDN 문서에서 존재한다는 것을 알았습니다 여러 가지 방법 VB.NET 프로그램 내에서 외부 DLL의 함수에 대한 참조를 선언합니다.

혼란스러운 것은 MSDN이 당신이 만 사용할 수 있다고 주장한다는 것입니다. dllimportattribute 공유 기능 프로토 타입으로 클래스 "드문 경우"하지만이 진술에 대한 설명을 찾을 수 없었지만 간단히 사용할 수 있습니다. Declare 대신 키워드.

이것들이 다른 이유이며 각 사례를 적절하게 사용합니까?

도움이 되었습니까?

해결책

선언은 실제로 유지하려는 시도입니다 p/호출 Visual Basic 6.0 사용자에게 더 친숙한 구문 vb.net. 그것은 p/invoke와 동일한 기능을 많이 가지고 있지만 특정 유형의 마샬링은 매우 다르며 dllimport 규칙에 더 친숙한 사람들에게 약간의 혼란을 야기 할 수 있습니다.

나는 문서가 "희귀 한"구별로 무엇을 암시하는지 완전히 확신하지 못한다. 발행없이 VB.NET 및 C#에서 자주 코드에서 dllimport를 사용합니다.

일반적으로, 나는 당신이 Visual Basic 6.0 배경에서 오지 않는 한 dllimport를 사용합니다. Dllimport의 문서와 샘플은 훨씬 나아졌으며 Dllimport 선언을 생성하는 것을 목표로하는 많은 도구가 있습니다.

다른 팁

분명히 선언과 dllimport 진술은 기본적으로 동일합니다. 원하는 것을 사용할 수 있습니다.

다음은 각각에서 약간 다르게 작동 할 수있는 몇 가지 요점에 대한 논의이며, 이는 다른 하나보다 선호도에 영향을 줄 수 있습니다.

나는 Visual Studio 2003에 관한 MSDN의 기사로 시작했습니다. dllimport 속성 사용. (조금 오래되었지만 dllimport 진술이 .NET에서 시작된 것으로 보이므로 처음으로 돌아가는 것이 적절 해 보였습니다.)

예제 Dllimport 진술서가 주어지면 :

[DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]
int MessageBox(void* hWnd, wchar_t* lpText, wchar_t* lpCaption, unsigned int uType);

Entrypoint 값이 제외되면 CLR 함수의 이름 (이 경우 MessageBox,)을 기본값으로 찾습니다. 그러나이 경우 유니 코드의 숯이 지정되었으므로 CLR은 먼저 "MessageBoxw"라는 함수를 찾습니다. (ANSI 리턴 유형 버전은 "MessageBoxa"입니다.) "MessageBoxw"가 발견되지 않으면 CLR은 실제로 "MessageBox"라는 API 함수를 찾습니다.

dllimportattribute 클래스에 대한 현재 세부 사항은 여기에서 찾을 수 있습니다. 여기서 .NET Framework 4 버전을 보았습니다. dllimportattribute 클래스

이 .NET Framework 4 페이지의 비고 섹션의 주요 의견은 다음과 같습니다.

이 속성을 C# 및 C ++ 메소드 정의에 직접 적용합니다. 그러나 시각적 기본 컴파일러는 선언문을 사용할 때이 속성을 방출합니다.

따라서 적어도 VB.net과 관련하여 컴파일러는 Declare 어쨌든 진술.

이 페이지에는 중요한 메모도 있습니다.

dllimportattribute는 일반 유형의 마샬링을 지원하지 않습니다.

따라서 일반적인 유형을 사용하려면 Declare 성명.

다음으로, 나는 선언문 정보로 향했다. Visual Studio 2010 버전 (Visual Basic Statement Info)이 다음과 같습니다. 선언문

여기서 중요한 항목은이 메모였습니다.

모듈 레벨에서만 선언을 사용할 수 있습니다. 이는 외부 참조에 대한 선언 컨텍스트가 클래스, 구조 또는 모듈 여야하며 소스 파일, 네임 스페이스, 인터페이스, 프로 시저 또는 블록이 될 수 없음을 의미합니다.

분명히 클래스, 구조 또는 모듈 외부에서 API 호출을 설정하려면 Declare.

Declare 이 페이지의 문장은 다음과 같습니다.

Declare Function getUserName Lib "advapi32.dll" Alias "GetUserNameA" (
  ByVal lpBuffer As String, ByRef nSize As Integer) As Integer

이 예를 따르는이 작은 정보는 다음과 같습니다.

dllimportattribute는 관리되지 않는 코드에서 기능을 사용하는 대체 방법을 제공합니다. 다음 예제는 선언문을 사용하지 않고 가져온 기능을 선언합니다.

물론 Dllimport 사용의 예가 이어집니다.

유니 코드 대 ANSI 결과와 관련하여,이 선언 페이지에 따르면, charset 값을 지정하는 경우 (위의 예제에 사용 가능하지만 위의 예에 표시되지 않음) CLR은 dllimport와 동일한 유형의 자동 이름 검색을 수행합니다. ANSI.

당신이 charset 값을 지정하지 않는 경우 Declare 진술, 그러면 선언의 함수 이름이 실제 API 함수의 헤더 파일의 함수 이름과 동일하거나 an을 지정해야합니다. Alias 헤더 파일의 실제 함수 이름과 일치하는 값 (위의 예와 같이).

나는 위에 언급 된 것 이외의 상황에서 dllimport 또는 선언이 선호되거나 권장되었다는 특정 Microsoft 문서를 찾을 수 없었습니다.

그러므로 나의 결론은 다음과 같습니다.

1) 정의를 장소 중 하나에 배치 할 필요가없는 한 Declare 진술을 사용할 수없고, 기술은 모두 잘 작동하며

그리고

2) dllimport를 사용하는 경우 원하는 숯 값 (유니 코드 또는 ANSI)을 지정하거나 예상치 못한 결과를 얻을 수 있습니다.

내 생각에,이 키워드는 박수로 보이지 않으므로 검색 한 내용에서 속성보다는 컴파일 타임 키워드를 사용합니다.

또한, 당신이 사용할 때 Declare, 당신은 쓸 필요가 없습니다 End Function. 그 장점은 코드를 DllImport모래 End Function에스.

사용을 선언 할 때 Declare 키워드, 컴파일러는이 기능을 처리합니다 Shared 어쨌든 다른 extenal 객체를 통해 액세스 할 수 있습니다.

그러나 현재 VB.NET에서는 모두 동일한 목표로 다루어졌으며 성능 차이가 없습니다. 이에 대한 보증은 없습니다.

그래서 내 결론은 : dllimport 대신 선언을 사용하십시오., 특히 당신이 그것을 인용 한 것을 읽습니다 Microsoft가 말했습니다 드문 경우에 사용해야합니다.

다음 옵션 중 하나를 설정 해야하는 경우 사용하십시오. DllImportAttribute 속성, else use Declare. 에서 https://msdn.microsoft.com/en-us/library/w4byd5y4.aspx

BestFitMapping, CallingConvention, ExactSpelling, PreservesIg, SetLasterror 또는 ThrowOnUnMappableChar 필드를 Microsoft Visual Basic 2005 선언에 적용하려면 선언문 대신 DllimportAttribute 속성을 사용해야합니다.

위의 참조는 "Visual Basic 2005"에만 적용되는지 여부 만 위의 참조에서는 불분명합니다. 그러나 나는 또한이 기사를 찾았다 (https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute(v=vs.110).aspx )) DllImportAttribute .NET 4.5의 클래스 :

Declare 문을 사용할 때 Visual Basic 컴파일러 가이 속성을 제출합니다. BestFitMapping, CallingConvention, ExactSpelling, PreservesIg, SetLasterror 또는 ThrowONUNMAPPABLECHAR 필드를 포함한 복잡한 메소드 정의의 경우이 속성을 Visual Basic 메소드 정의에 직접 적용합니다..

이것은 당신에게 그것을 알려줍니다 Declare 옵션은 VB.NET 구문 설탕으로 전환됩니다 DllImportAttribute 컴파일 시간에 사용시 정확한 시나리오를 설명합니다. DllImportAttribute 직접 권장됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top