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é?

Était-ce utile?

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,

  1. 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 )

  1. 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
  1. 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 code

gé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.

Le code

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top