/CLRSUPPORTLASTERROR (PInvoke 호출에 대한 마지막 오류 코드 유지)

/CLRSUPPORTLASTERROR기본적으로 설정되는 P/Invoke 메커니즘을 통해 호출된 함수의 마지막 오류 코드를 유지합니다. 이를 통해 컴파일된 /clr코드에서 DLLS의 네이티브 함수를 호출할 수 있습니다.

구문

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

설명

마지막 오류 코드를 유지하면 성능이 저하됩니다. 마지막 오류 코드를 유지하는 데 따른 성능 비용이 발생하지 않으려면 다음을 사용하여 /CLRSUPPORTLASTERROR:NO연결합니다.

시스템 DLL의 함수에 대한 마지막 오류 코드만 유지하는 연결 /CLRSUPPORTLASTERROR:SYSTEMDLL하여 성능 저하를 최소화할 수 있습니다.

참고 항목

마지막 오류 유지는 동일한 모듈의 CLR 코드에서 사용되는 관리되지 않는 함수에는 지원되지 않습니다.

  • 자세한 내용은 (공용 언어 런타임 컴파일)을 참조 /clr 하세요.

Visual Studio 개발 환경에서 이 링커 옵션을 설정하려면

  1. 프로젝트에 대한 속성 페이지 대화 상자를 엽니다. 자세한 내용은 컴파일러 및 빌드 속성 설정을 참조 하세요.

  2. 구성 속성>링커>고급 속성 페이지를 선택합니다.

  3. PInvoke 호출 속성에 대한 마지막 오류 코드 유지를 수정합니다. 확인을 선택하거나 적용하여 변경 내용을 저장합니다.

프로그래밍 방식으로 이 링커 옵션을 설정하려면

예제

다음 샘플에서는 마지막 오류를 수정하는 하나의 내보낸 함수를 사용하여 네이티브 DLL을 정의합니다.

// CLRSUPPORTLASTERROR_dll.cpp
// compile with: /LD
#include <windows.h>
#include <math.h>

#pragma unmanaged
__declspec(dllexport) double MySqrt(__int64 n) {
   SetLastError(DWORD(-1));
   return sqrt(double(n));
}

다음 샘플에서는 DLL을 사용하여 사용하는 /CLRSUPPORTLASTERROR방법을 보여 줍니다.

// CLRSUPPORTLASTERROR_client.cpp
// compile with: /clr CLRSUPPORTLASTERROR_dll.lib /link /clrsupportlasterror:systemdll
// processor: x86
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <math.h>

#pragma comment(lib, "wininet.lib")

double MySqrt(__int64 n);

#pragma managed
int main() {
   double   d = 0.0;
   __int64 n = 65;
   HANDLE  hGroup = NULL;
   GROUPID groupID;
   DWORD   dwSet = 127, dwGet = 37;

   SetLastError(dwSet);
   d = MySqrt(n);
   dwGet = GetLastError();

   if (dwGet == DWORD(-1))
      printf_s("GetLastError for application call succeeded (%d).\n",
             dwGet);
   else
      printf_s("GetLastError for application call failed (%d).\n",
             dwGet);

   hGroup = FindFirstUrlCacheGroup(0, CACHEGROUP_SEARCH_ALL,
                           0, 0, &groupID, 0);
   dwGet = GetLastError();
   if (dwGet == 183)
      printf_s("GetLastError for system call succeeded (%d).\n",
             dwGet);
   else
      printf_s("GetLastError for system call failed (%d).\n",
             dwGet);
}
GetLastError for application call failed (127).
GetLastError for system call succeeded (183).

참고 항목

MSVC 링커 참조
MSVC 링커 옵션