Qu'est-ce que le code géré ou non géré en programmation?
-
22-07-2019 - |
Question
J'utilise une commande spécifique dans mon code C #, qui fonctionne bien. Cependant, on dit qu'il se comporte mal en mode "non géré". code.
Qu'est-ce que le code géré ou non géré?
La solution
Voici un texte de MSDN sur le code non géré .
Certains codes de bibliothèque doivent faire appel à du code non géré (par exemple, des API de code natif, telles que Win32). Étant donné que cela signifie qu’il faut sortir du périmètre de sécurité pour le code géré, vous devez être très prudent.
Voici quelques explications complémentaires sur le code géré:
- Code exécuté par le CLR.
- Le code qui cible le Common Language Runtime, la base du .NET Framework, est appelé code géré.
- Le code géré fournit les métadonnées nécessaires au CLR pour fournir des services tels que la gestion de la mémoire, l'intégration multilingue, la sécurité d'accès au code et le contrôle automatique de la durée de vie des objets. Tout code basé sur IL s’exécute en tant que code géré.
- Code qui s'exécute dans l'environnement d'exécution de la CLI.
Pour votre problème:
Je pense que c'est parce que NUnit exécute votre code pour UnitTesting et qu'il est possible que certaines de ses parties ne soient pas gérées. Mais je n'en suis pas sûr, alors ne prenez pas cela pour de l'or. Je suis sûr que quelqu'un pourra vous donner plus d'informations à ce sujet. J'espère que ça aide!
Autres conseils
This est un bon article sur le sujet.
Pour résumer,
- Le code géré n'est pas compilé en code machine mais en un langage intermédiaire interprété et exécuté par un service donné sur une machine et fonctionne donc dans un cadre sécurisé (espérons-le!) qui gère les opérations dangereuses. comme la mémoire et les discussions pour vous. Dans l’usage moderne, cela signifie souvent .NET mais n’a pas à le faire.
Un programme d'application exécuté dans un moteur d'exécution installé dans la même machine. L'application ne peut pas s'exécuter sans elle. L’environnement d’exécution fournit la bibliothèque générale de logiciels routines que le programme utilise et exécute généralement de la mémoire la gestion. Il peut également fournir une conversion juste à temps (JIT) à partir de code source en code exécutable ou d'un langage intermédiaire à code exécutable. Common Language Runtime de Java, Visual Basic et .NET (CLR) sont des exemples de moteurs d'exécution. ( En savoir plus )
- Le code non géré est compilé en code machine et donc exécuté directement par le système d'exploitation. Il a donc la capacité de faire des choses dommageables / puissantes que le code géré ne fait pas. C’est ainsi que tout fonctionnait, alors il est généralement associé à des éléments anciens tels que .dlls.
Un programme exécutable qui s'exécute tout seul. Lancé à partir de l'exploitation système, le programme appelle et utilise les routines logicielles du système d’exploitation, mais ne nécessite pas l’utilisation d’un autre logiciel. utilisé. Programmes de langue d'assemblage assemblés dans une machine programmes de langage et C / C ++ compilés en langage machine pour un Des exemples de code non géré figurent notamment sur cette plate-forme. plus )
-
Le code
- natif est souvent synonyme de non géré, mais n'est pas identique.
Lorsque vous pensez à unmanaged , pensez à un code spécifique à une machine. Comme le langage d'assemblage x86. Le code non géré (natif) est compilé et lié pour s'exécuter directement sur le processeur pour lequel il a été conçu, en excluant tout le contenu du système d'exploitation pour le moment. Ce n'est pas portable, mais c'est rapide. Très simple, code simplifié.
Le codegéré englobe tout, de Java à l'ancien interprétatif BASIC, en passant par tout ce qui fonctionne sous .NET. Le code géré est généralement compilé en un jeu d'instructions de niveau P-Code ou Octet de niveau intermédiaire. Ce ne sont pas des instructions spécifiques à la machine, bien qu'elles ressemblent au langage d'assemblage. Le code géré isole le programme de la machine sur laquelle il est exécuté et crée une limite sécurisée dans laquelle toute la mémoire est allouée indirectement. De manière générale, vous n'avez pas d'accès direct aux ressources de la machine telles que les ports, l'espace d'adressage mémoire, la pile, etc. L’idée est de fonctionner dans un environnement plus sécurisé.
Pour convertir une variable gérée, par exemple en une variable non gérée, vous devez accéder à l'objet lui-même. Il est probablement emballé ou emballé dans un emballage supplémentaire. Les variables non gérées (comme un "int", par exemple) - sur une machine 32 bits - prennent exactement 4 octets. Il n'y a pas de frais généraux ou d'emballage supplémentaire. Le processus consistant à passer du code géré au code non géré, et inversement, est appelé " marshaling ". Cela permet à vos programmes de franchir la frontière.
En aussi peu de mots que possible:
- code géré = programmes .NET
- code non géré = " normal " programmes
Fondamentalement, le code non managé est un code qui ne s'exécute pas sous le CLR .NET (autrement dit pas VB.NET, C #, etc.). Mon hypothèse est que NUnit a un coureur / wrapper qui n’est pas du code .NET (alias C ++).
Code géré:
Code fonctionnant sous un "contrat de coopération" avec le common language runtime. Le code géré doit fournir les métadonnées nécessaire à l'exécution pour fournir des services tels que la mémoire gestion, intégration multilingue, sécurité d'accès au code et contrôle automatique de la durée de vie des objets. Tout code basé sur Microsoft Le langage intermédiaire (MSIL) s'exécute en tant que code géré.Code non géré:
Code qui est créé sans tenir compte de la conventions et exigences du Common Language Runtime. Non géré le code s'exécute dans l'environnement d'exécution de langage commun avec un minimum services (par exemple, pas de récupération de place, débogage limité, et etc.).
Référence: http: // www. dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx
NUnit charge les tests unitaires dans un AppDomain séparé, et je suppose que le point d'entrée n'est pas appelé (probablement pas nécessaire), donc l'assembly d'entrée est nul.
Géré est ce que les compilateurs C # .Net, VB.Net, F # .Net, etc. créent. Il fonctionne sur le CLR, qui offre, entre autres, des services tels que le ramassage des ordures, la vérification des références, etc. Alors, pensez-y, mon code est géré par le CLR.
D'autre part, le code non géré est compilé directement dans le code machine. Il ne gère pas par CLR.
Le code managé s'exécute dans l'environnement de CLR, c'est-à-dire le runtime .NET. En bref, tous les IL sont gérés. code.Mais si vous utilisez un exemple de logiciel tiers composant VB6 ou VC ++, ils sont le code non managé comme .NET runtime (CLR) n'a pas le contrôle sur l'exécution du code source de la langue.
Code géré: - Code sous lequel le formulaire MSIL (langage intermédiaire) est développé après la compilation du compilateur de langage et exécuté directement par CLR
appelé code géré.
Par exemple: - Les 61 codes de langue pris en charge par le framework .net
Code non géré: - code développé avant .net
pour lequel le formulaire MSIL n'est pas disponible et exécuté directement par CLR
plutôt que CLR
. redirigera vers le système d'exploitation, cela s'appelle du code non managé.
Par exemple: -COM, API Win32
- Code géré : code écrit en langage .NET, tel que C #, VB.NET.
- Code non géré : code non écrit en langage .NET, contrairement à MSIL. ne comprend pas ce que c'est et ne peut pas courir sous CLR; comme des contrôles tiers que nous avons utilisés dans nos applications .NET et qui ne sont pas créés dans les langages .NET.
Tout d’abord, comprenez cela. Avant .NET Framework
, Microsoft
fournissait des produits autonomes tels que MFC (Visual C ++), VB, FoxPro
etc.
En 2002, Microsoft a combiné ses produits et a créé .NET Framework. Il existe maintenant une différence entre la façon dont le code a été exécuté auparavant et la manière dont il est géré et exécuté dans .NET Framework. Microsoft a introduit le concept de CLR
avec .NET Framework qui compile le code provenant de toute infrastructure supportée du .NET Framework et fournit des fonctionnalités supplémentaires telles que la gestion de la mémoire, le garbage collection
etc. Mais, de telles fonctionnalités CLR n'étaient pas disponibles directement avant.
Donc, si vous créez une bibliothèque / du code dans un framework .NET (compilé avec CLR) s’appelle alors
code géré
. Vous pouvez utiliser cette bibliothèque plus loin dans d’autres applications / projets .NET, et là aussi, CLR comprendre comment il a été compilé auparavant, et c’est pourquoi il reste votre gérer le code.
OTOH si vous voulez utiliser les bibliothèques écrites avant le .NET Framework, vous pouvez le faire avec certaines limitations, mais rappelez-vous, puisque le CLR n'était pas là à ce moment-là, le CLR ne comprendra pas et ne compilera pas ce code à nouveau. Et cela sera appelé code non géré
. Veuillez noter que les bibliothèques / associations créées par des tiers pour fournir certaines fonctionnalités / outils peuvent également être considérées comme du code non géré si elles ne sont pas compatibles avec le CLR.
En termes simples, Gérer le code est une chose que votre CLR comprend et peut le compiler lui-même pour une exécution ultérieure. Dans .NET Framework (quel que soit le langage utilisé sur .NET Framework) Lorsque le code est redirigé vers le CLR, le code fournit des informations de métadonnées afin que le CLR puisse vous fournir les fonctionnalités spécifiées ici . La récupération de place, les améliorations de performances, l'intégration multilingue, la gestion de la mémoire
, etc.
OTOH, le code non configuré est spécifique à la machine et prêt à être utilisé. Inutile de le traiter davantage.
À partir de Pro C # 5 et du .NET 4.5 Framework:
Code géré ou non géré: Le point le plus important à comprendre sur le langage C # est peut-être qu’il peut produire du code qui peut s’exécuter que dans le runtime .NET (vous ne pouvez jamais utiliser C # pour créer un serveur COM natif ou application C / C ++ non gérée). Officiellement parlant, le terme utilisé pour décrire le code ciblant le Le runtime .NET est un code géré. L'unité binaire qui contient le code géré est appelée un assemblage. (plus de détails sur les assemblages dans un peu). Inversement, le code qui ne peut pas être directement hébergé par le .NET le runtime est appelé code non géré.