Bagikan melalui


/CLRSUPPORTLASTERROR (Pertahankan Kode Kesalahan Terakhir untuk Panggilan PInvoke)

/CLRSUPPORTLASTERROR, yang aktif secara default, mempertahankan kode kesalahan terakhir fungsi yang disebut melalui mekanisme P/Invoke, yang memungkinkan Anda untuk memanggil fungsi asli di DLLS, dari kode yang dikompilasi dengan /clr.

Sintaks

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

Keterangan

Mempertahankan kode kesalahan terakhir menyiratkan penurunan performa. Jika Anda tidak ingin dikenakan biaya performa untuk mempertahankan kode kesalahan terakhir, tautkan dengan menggunakan /CLRSUPPORTLASTERROR:NO.

Anda dapat meminimalkan penalti performa dengan menautkan dengan /CLRSUPPORTLASTERROR:SYSTEMDLL, yang hanya mempertahankan kode kesalahan terakhir untuk fungsi dalam DLL sistem.

Catatan

Mempertahankan kesalahan terakhir tidak didukung untuk fungsi yang tidak dikelola yang digunakan oleh kode CLR dalam modul yang sama.

Untuk mengatur opsi linker ini di lingkungan pengembangan Visual Studio

  1. Buka kotak dialog Halaman Properti untuk proyek. Untuk informasi selengkapnya, lihat Mengatur properti kompilator dan build.

  2. Pilih halaman properti Tingkat Lanjut Linker>Properti>Konfigurasi.

  3. Ubah properti Pertahankan Kode Kesalahan Terakhir untuk Panggilan PInvoke. Pilih OK atau Terapkan untuk menyimpan perubahan Anda.

Untuk menyetel opsi linker ini secara terprogram

Contoh

Sampel berikut mendefinisikan DLL asli dengan satu fungsi yang diekspor yang memodifikasi kesalahan terakhir.

// 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));
}

Sampel berikut menggunakan DLL, yang menunjukkan cara menggunakan /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).

Baca juga

Referensi linker MSVC
Opsi linker MSVC