Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Notez les restrictions suivantes sur l’utilisation de /clr:
Dans un gestionnaire d’exceptions structurées, il existe des restrictions sur l’utilisation
_allocalors de la compilation avec/clr. Pour plus d’informations, consultez_alloca.L’utilisation des vérifications d’erreur au moment de l’exécution n’est pas valide avec
/clr. Pour plus d’informations, consultez Guide pratique pour utiliser des vérifications d’exécution natives.Lorsqu’il
/clrest utilisé pour compiler un programme qui utilise uniquement la syntaxe C++ standard, les instructions suivantes s’appliquent à l’utilisation d’un assembly inline :Le code de l’assembly inline qui suppose des connaissances de la disposition de pile native, des conventions d’appel en dehors de la fonction active ou d’autres informations de bas niveau sur l’ordinateur peut échouer si ces connaissances sont appliquées au frame de pile pour une fonction managée. Les fonctions contenant du code d’assembly inline sont générées en tant que fonctions non managées, comme si elles étaient placées dans un module distinct qui a été compilé sans
/clr.Le code d’assembly inline dans les fonctions qui passent les paramètres de fonction construits par copie n’est pas pris en charge.
Les
vprintffonctions ne peuvent pas être appelées à partir d’un programme compilé avec/clr.Le
naked__declspecmodificateur est ignoré sous/clr.La fonction translator définie par
_set_se_translatoraffectera uniquement les captures dans du code non managé. Pour plus d’informations, consultez Gestion des exceptions.La comparaison des pointeurs de fonction n’est pas autorisée sous
/clr.L’utilisation de fonctions qui ne sont pas entièrement prototypes n’est pas autorisée sous
/clr.Les options de compilateur suivantes ne sont pas prises en charge avec
/clr:/EHscet/EHs(/clrimplique/EHa(voir (Modèle/EHde gestion des exceptions))/fp:strictet/fp:except(voir/fp(Spécifier le comportement à virgule flottante))
La combinaison de la
_STATIC_CPPLIBdéfinition de préprocesseur (/D_STATIC_CPPLIB) et de l’option/clrdu compilateur n’est pas prise en charge. Cela est dû au fait que la définition entraînerait la liaison de votre application avec la bibliothèque standard C++ statique multithread, qui n’est pas prise en charge. Pour plus d’informations, consultez/MD,/MT/LD(Utiliser la bibliothèque d’exécution).Lorsque vous utilisez
/Zi/clr, il existe des implications en matière de performances. Pour plus d’informations, consultez/Zi.Le passage d’un caractère large à une routine de sortie .NET Framework sans spécifier
/Zc:wchar_tou sans caster le caractère entraîne_wchar_tl’affichage de la sortie sous la forme d’ununsigned short int. Par exemple :Console::WriteLine(L' ') // Will output 32. Console::WriteLine((__wchar_t)L' ') // Will output a space./GSest ignoré lors de la compilation avec/clr, sauf si une fonction est sous#pragma unmanagedou si la fonction doit être compilée en tant que code natif, auquel cas le compilateur génère l’avertissement C4793, qui est désactivé par défaut.Consultez
/ENTRYles exigences de signature de fonction d’une application managée.Les applications compilées avec
/openmpet/clrne peuvent être exécutées que dans un seul processus appdomain. Pour plus d’informations, consultez/openmp(Activer la prise en charge d’OpenMP 2.0)..Les fonctions qui prennent un nombre variable d’arguments (varargs) seront générées en tant que fonctions natives. Les types de données managés dans la position d’argument de variable seront marshalés en types natifs. Tous les System.String types sont des chaînes à caractères larges, mais ils sont marshalés en chaînes de caractères à un octet. Par conséquent, si un
printfspécificateur est%S(wchar_t*), il est marshalé vers une%schaîne à la place.Lorsque vous utilisez la macro, vous pouvez obtenir des résultats inattendus lors de la
va_argcompilation avec/clr:pure. Pour plus d’informations, consultez , ,va_endva_copy,va_start.va_argLes/clr:pureoptions du compilateur et/clr:safedes options sont déconseillées dans Visual Studio 2015 et non prises en charge dans Visual Studio 2017 et versions ultérieures. Le code qui doit être « pur » ou « sécurisé » doit être porté sur C#.Vous ne devez pas appeler de fonctions qui guident la pile pour obtenir des informations sur les paramètres (arguments de fonction) à partir du code managé. La couche P/Invoke entraîne l’exécution de ces informations plus loin dans la pile. Par exemple, ne compilez pas le proxy/stub avec
/clr.Les fonctions seront compilées en code managé chaque fois que possible, mais les constructions C++ ne peuvent pas toutes être traduites en code managé. Cette détermination est effectuée fonction par fonction. Si une partie d’une fonction ne peut pas être convertie en code managé, la fonction entière est convertie en code natif à la place. Les cas suivants empêchent le compilateur de générer du code managé.
Fonctions d’assistance ou conversions de code (thunks) générées par le compilateur. Des thunks natifs sont générés pour tout appel de fonction via un pointeur de fonction, notamment les appels de fonction virtuels.
Fonctions qui appellent
setjmpoulongjmp.Fonctions qui utilisent certaines routines intrinsèques pour manipuler directement des ressources de l’ordinateur. Par exemple, l’utilisation de
__enableet__disable,_ReturnAddresset_AddressOfReturnAddress, ou des intrinsèques multimédias aboutissent tous à du code natif.Fonctions qui suivent la directive
#pragma unmanaged. (L’inverse, est#pragma managedégalement pris en charge.)Fonction qui contient des références à des types alignés, autrement dit des types déclarés à l’aide de
__declspec(align(...)).