web-dev-qa-db-fra.com

Qu'est-ce que le code géré ou non géré en programmation?

J'utilise une commande spécifique dans mon code C #, qui fonctionne bien. Cependant, on dit qu'il se comporte mal dans un code "non géré".

Qu'est-ce qu'un code géré ou non géré?

140
Pokus

Voici un texte de MSDN à propos de code non managé .

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 que vous devez sortir du périmètre de sécurité pour le code géré, vous devez faire preuve de la plus grande prudence.

Voici une autre explication complémentaire 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 managé.
  • 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 le 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 peut en avoir une partie non gérée. 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!

70
Patrick Desjardins

This est un bon article sur le sujet.

Résumer,

  1. Le code managé 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 fonctionnant donc dans un (espérons) !) cadre sécurisé qui gère des choses dangereuses comme la mémoire et les threads 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é sur le même ordinateur. L'application ne peut pas s'exécuter sans elle. L'environnement d'exécution fournit la bibliothèque générale des routines logicielles utilisées par le programme et effectue généralement la gestion de la mémoire. Il peut également fournir une conversion juste à temps (JIT) du code source au code exécutable ou du langage intermédiaire au code exécutable. Java, Visual Basic et le langage CLR (Common Language Runtime) de .NET sont des exemples de moteurs d'exécution. ( en savoir plus )

  1. Le code non géré est compilé en code machine et est 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é à de vieilles choses comme .dlls.

Un programme exécutable qui s'exécute tout seul. Lancé à partir du système d'exploitation, le programme appelle et utilise les routines logicielles du système d'exploitation, mais ne nécessite pas l'utilisation d'un autre système logiciel. Les programmes en langage assembleur assemblés en langage machine et les programmes C/C++ compilés en langage machine pour une plate-forme particulière sont des exemples de code non managé. ( En savoir plus )

  1. Le code natif est souvent synonyme de non géré, mais n'est pas identique.
186
annakata

Lorsque vous pensez à non géré, pensez à un code spécifique à la 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 système d'exploitation pour le moment. Ce n'est pas portable, mais c'est rapide. Très simple, code épuré.

Géré le code est tout, de Java à l'ancien Interpretive BASIC, ou à tout ce qui s'exécute sous .NET. Le code managé est généralement compilé en un code P ou en octets de niveau intermédiaire. Ces instructions ne sont pas spécifiques à la machine, bien qu'elles ressemblent au langage d'assemblage. Le code managé 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. ne pas avoir un 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é.

Par exemple, pour convertir une variable gérée 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 de passage du code géré au code non géré - et inversement - s'appelle "marshaling". Cela permet à vos programmes de franchir la frontière.

65
TJPowell

En aussi peu de mots que possible:

  • code managé = programmes .NET
  • code non géré = programmes "normaux"
22
Vilx-

Fondamentalement, le code non géré 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++).

4
joegtp

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écessaires au moteur d'exécution 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 le code basé sur le langage intermédiaire Microsoft (MSIL) s'exécute en tant que code géré.

Code non géré:
Code créé sans tenir compte des conventions et des exigences du Common Language Runtime. Le code non géré s'exécute dans l'environnement d'exécution de langage commun avec des services minimaux (par exemple, aucune récupération de place, un débogage limité, etc.).

Référence: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx

4
GMalla

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), par conséquent l'entrée Assembly est nulle.

3
leppie

Le code géré s'exécute dans l'environnement du CLR, c'est-à-dire .NET runtime. En bref, tous les IL sont du code géré. sur l'exécution du code source du langage.

2
chirag Makwana

Géré le code est ce que les compilateurs C # .Net, VB.Net, F # .Net, 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 en code machine. Il ne gère pas par CLR.

2
Arif

Code géré: - Code qui forme 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 qu'il est exécuté par CLR directement plutôt que CLR redirigera vers le système d'exploitation, il s'agit du code non géré.

par exemple: API de gestion de contenu, Win32

1
Ashok Narwal
  • Géré Code: code écrit en langage .NET comme C #, VB.NET.
  • nManaged Code: code non écrit en langage .NET et MSIL ne comprend pas ce que c'est et ne peut pas s'exécuter sous CLR; comme les contrôles tiers que nous avons utilisés dans nos applications .NET et qui ne sont pas créés dans les langages .NET.
1
Saket Kumar

Tout d’abord, comprenez cela, avant que .NET framework, Microsoft ne fournisse les produits autonomes tels que MFC (Visual C++), VB, FoxPro etc.

En 2002, Microsoft a combiné ses produits pour créer .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 n'importe quel lanugague pris en charge du .NET Framework et fournit des fonctionnalités supplémentaires telles que memory mangement, garbage collection, Etc. avant.

Donc, si vous créez une bibliothèque/du code dans un framework .NET (compilé avec CLR), cela s'appelle Managed code. Vous pouvez utiliser cette bibliothèque plus loin dans d'autres applications/projets .NET. Là aussi, CLR comprendra comment elle avait été compilée auparavant et c'est pourquoi il reste votre code de gestion.

OTOH si vous souhaitez 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 plus et ne compilera pas ce code à nouveau. . Et cela s'appellera unmanaged code. 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 quelque 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 passe à CLR, le code fournit des informations de métadonnées afin que le CLR puisse vous fournir les fonctionnalités spécifiées here . Peu d'entre eux sont Garbage collection, Performance improvements, cross-language integration, memory management Etc.

OTOH, du code non associé est quelque chose de spécifique à la machine et prêt à être utilisé, pas besoin de le traiter davantage.

0
Amnesh Goel

À partir de Pro C # 5 et de .NET 4.5 Framework:

Managed vs. Unmanaged Code: Peut-être le point le plus important à comprendre sur le langage C # est-il possible de générer du code pouvant être exécuté uniquement dans le runtime .NET (vous ne pouvez jamais utiliser C # pour créer un COM natif?) serveur ou une application C/C++ non gérée). Officiellement, le terme utilisé pour décrire le code ciblant 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 runtime .NET est appelé code non géré.

0
arush436