/clr Kısıtlamalar/clr Restrictions

/Clr kullanımı ile ilgili aşağıdaki kısıtlamalara göz önünde edin:Note the following restrictions on the use of /clr:

  • Yapılandırılmış bir özel durum işleyicisinde, _alloca /clr ile derlerken kullanılan kısıtlamalar vardır.In a structured exception handler, there are restrictions on using _alloca when compiling with /clr. Daha fazla bilgi için bkz. _alloca.For more information, see _alloca.

  • Çalışma zamanı hata denetimlerinin kullanımı /clr ile geçerli değildir.The use of run-time error checks is not valid with /clr. Daha fazla bilgi için bkz. nasıl yapılır: yerel Run-Time denetimleri kullanma.For more information, see How to: Use Native Run-Time Checks.

  • /Clr yalnızca standart C++ söz dizimini kullanan bir programı derlemek için kullanıldığında, satır içi derlemenin kullanımı için aşağıdaki yönergeler geçerlidir:When /clr is used to compile a program that only uses standard C++ syntax, the following guidelines apply to the use of inline assembly:

    • Yerel yığın düzeni hakkında bilgi sahibi olan satır içi derleme kodu, geçerli işlevin dışındaki kuralları çağırma veya yönetilen bir işlev için yığın çerçevesine bu bilgi uygulanırsa bilgisayar hakkındaki diğer alt düzey bilgiler başarısız olabilir.Inline assembly code that assumes knowledge of the native stack layout, calling conventions outside of the current function, or other low-level information about the computer may fail if that knowledge is applied to the stack frame for a managed function. Satır içi derleme kodu içeren işlevler, /clr olmadan derlenen ayrı bir modüle yerleştirilmiş gibi yönetilmeyen işlevler olarak oluşturulur.Functions containing inline assembly code are generated as unmanaged functions, as if they were placed in a separate module that was compiled without /clr.

    • Kopyalama ile oluşturulmuş işlev parametrelerini geçiren işlevlerde satır içi derleme kodu desteklenmiyor.Inline assembly code in functions that pass copy-constructed function parameters is not supported.

  • Vprintf işlevleri /clr ile derlenen bir programdan çağrılamaz.The vprintf Functions cannot be called from a program compiled with /clr.

  • Naked __declspec değiştiricisi/CLRaltında yok sayılır.The naked __declspec modifier is ignored under /clr.

  • _Set_se_translator tarafından ayarlanan Translator işlevi yalnızca yönetilmeyen koddaki catch 'i etkiler.The translator function set by _set_se_translator will affect only catches in unmanaged code. Daha fazla bilgi için bkz. özel durum işleme .See Exception Handling for more information.

  • İşlev işaretçilerinin karşılaştırmasına /clr altında izin verilmez.The comparison of function pointers is not permitted under /clr.

  • Tam prototipi bulunmayan işlevlerin kullanılmasına /clr altında izin verilmez.The use of functions that are not fully prototyped is not permitted under /clr.

  • Aşağıdaki derleyici seçenekleri /clr ile desteklenmez:The following compiler options are not supported with /clr:

  • _STATIC_CPPLIBÖnişlemci tanımının ( /D_STATIC_CPPLIB ) ve /clr derleyici seçeneğinin birleşimi desteklenmez.The combination of the _STATIC_CPPLIB preprocessor definition (/D_STATIC_CPPLIB) and the /clr compiler option is not supported. Bu, tanım uygulamanızın statik çok iş parçacıklı C++ standart kitaplığıyla bağlantı oluşturmasına neden olacağından, desteklenmeyen bir uygulamadır.This is so because the definition would cause your application to link with the static multithreaded C++ Standard Library, which is not supported. Daha fazla bilgi için bkz. /MD,/MT,/LD (Run-Time kitaplığı kullanın) konusu.For more information, see the /MD, /MT, /LD (Use Run-Time Library) topic.

  • /Clr ile /Zi kullanırken performans olumsuz etkileri vardır.When using /Zi with /clr, there are performance implications. Daha fazla bilgi için bkz. /Zi.For more information, see /Zi.

  • Bir .NET Framework çıkış yordamına, /Zc: wchar_t veya karakteri atama olmadan geniş bir karakter geçirme, __wchar_t çıktının bir olarak görünmesine neden olur unsigned short int .Passing a wide character to a .NET Framework output routine without also specifying /Zc:wchar_t or without casting the character to __wchar_t will cause the output to appear as an unsigned short int. Örneğin:For example:

    Console::WriteLine(L' ')              // Will output 32.
    Console::WriteLine((__wchar_t)L' ')   // Will output a space.
    
  • Bir işlev yönetilmeyen olarak veya işlevin yerel olarak derlenmesi gerekiyorsa, /clr ile derlerken /GS yok sayılır #pragma . Bu durumda, derleyici varsayılan olarak kapalı olan uyarı C4793 oluşturur./GS is ignored when compiling with /clr, unless a function is under #pragma unmanaged or if the function must be compiled to native, in which case the compiler will generate warning C4793, which is off by default.

  • Yönetilen bir uygulamanın işlev imzası gereksinimleri için bkz. /Entry .See /ENTRY for function signature requirements of a managed application.

  • /OpenMP ve /clr ile derlenen uygulamalar yalnızca tek bir AppDomain işleminde çalıştırılabilir.Applications compiled with /openmp and /clr can only be run in a single appdomain process. Daha fazla bilgi için bkz. /OpenMP (openmp 2,0 desteğini etkinleştir) .See /openmp (Enable OpenMP 2.0 Support) for more information.

  • Değişken sayıda bağımsız değişken (varargs) alan işlevler, yerel işlevler olarak oluşturulur.Functions that take a variable number of arguments (varargs) will be generated as native functions. Değişken bağımsız değişkeni konumundaki yönetilen tüm veri türleri yerel türlere göre sıralanır.Any managed data types in the variable argument position will be marshaled to native types. System.StringTürlerin gerçekten geniş karakterli dizeler olduğunu, ancak tek baytlık karakter dizelerine sıralandığına unutmayın.Note that System.String types are actually wide-character strings, but they are marshaled to single-byte character strings. Bu nedenle, bir printf belirticisi% S (wchar_t *) ise, bunun yerine% s dizesine göre sıralama yapılır.So if a printf specifier is %S (wchar_t*), it will marshal to a %s string instead.

  • Va_arg makrosunu kullanırken, /clr: Pure ile derlerken beklenmedik sonuçlar alabilirsiniz.When using the va_arg macro, you may get unexpected results when compiling with /clr:pure. Daha fazla bilgi için bkz. va_arg, va_copy, va_end, va_start.For more information, see va_arg, va_copy, va_end, va_start. /Clr: Pure ve /clr: Safe derleyici seçenekleri Visual Studio 2015 ' de kullanımdan kaldırılmıştır ve Visual Studio 2017 ve sonrasında desteklenmez.The /clr:pure and /clr:safe compiler options are deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017 and later. "Saf" veya "güvenli" olması gereken kod C# ' ye eklenmelidir.Code that must be "pure" or "safe" should be ported to C#.

  • Yönetilen koddan, yığın üzerinde parametre bilgilerini almak için yol gösteren işlevlerden (işlev bağımsız değişkenleri) çağrı yapmanız gerekmez; P/Invoke katmanı, bu bilgilerin yığının daha ileri altına alınmasına neden olur.You should not call, from managed code, any functions that walk the stack to get parameter information (function arguments); the P/Invoke layer causes that information to be further down the stack. Örneğin, /clr ile proxy/saplama derlenemiyor.For example, do not compile proxy/stub with /clr.

  • İşlevler mümkün olduğunda yönetilen koda derlenir, ancak tüm C++ yapıları yönetilen koda çevrilemeyebilir.Functions will be compiled to managed code whenever possible, but not all C++ constructs can be translated to managed code. Bu belirleme işlevi işlev temelinde yapılır.This determination is made on a function-by-function basis. Bir işlevin herhangi bir bölümü yönetilen koda dönüştürülemiyorsa, tüm işlev bunun yerine yerel koda dönüştürülür.If any part of a function cannot be converted to managed code, the entire function will be converted to native code instead. Aşağıdaki durumlar derleyicinin yönetilen kod oluşturmasını engeller.The following cases prevent the compiler from generating managed code.

    • Derleyicinin ürettiği dönüştürücüler veya yardımcı işlevleri.Compiler-generated thunks or helper functions. Yerel dönüştürücüler, sanal işlev çağrıları dahil olmak üzere bir işlev işaretçisi aracılığıyla herhangi bir işlev çağrısı için oluşturulur.Native thunks are generated for any function call through a function pointer, including virtual function calls.

    • Veya çağıran işlevler setjmp longjmp .Functions that call setjmp or longjmp.

    • Makine kaynaklarını doğrudan işlemek için belirli iç yordamları kullanan işlevler.Functions that use certain intrinsic routines to directly manipulate machine resources. Örneğin, __enable ve, __disable _ReturnAddress , ya da multimedya iç bilgileri kullanımı, _AddressOfReturnAddress yerel koda neden olur.For example, the use of __enable and __disable, _ReturnAddress and _AddressOfReturnAddress, or multimedia intrinsics will all result in native code.

    • Yönergesini izleyen işlevler #pragma unmanaged .Functions that follow the #pragma unmanaged directive. (Ters, #pragma managed ,, ayrıca desteklenir.)(Note that the inverse, #pragma managed, is also supported.)

    • Hizalanmış türlere yönelik başvuruları, yani kullanılarak belirtilen türleri içeren bir işlev __declspec(align(...)) .A function that contains references to aligned types, that is, types declared using __declspec(align(...)).

Ayrıca bkz.See also