Question

J'écris du code C/C++ depuis près de vingt ans, je connais Perl, Python, PHP et un peu de Java, et j'apprends moi-même JavaScript.Mais je n'ai jamais fait de trucs .NET, VB ou C#.Que fait exactement géré le code veut dire ?

Wikipédia le décrit simplement comme

Code qui s'exécute sous la gestion d'une machine virtuelle

et il dit spécifiquement que Java est (généralement) du code géré, donc

  • pourquoi le terme semble-t-il s'appliquer uniquement à C#/.NET ?
  • Pouvez-vous compiler C# dans un .exe contenant également la VM, ou devez-vous le conditionner et le donner à un autre .exe (à la java) ?

Dans le même esprit,

  • est-ce que .NET est un langue ou un cadre, et que signifie exactement « cadre » ici ?

OK, donc ça fait plus d'une question, mais pour quelqu'un qui est dans l'industrie depuis aussi longtemps que moi, je me sens plutôt N00B en ce moment...

Était-ce utile?

La solution

Lorsque vous compilez du code C# dans un fichier .exe, il est compilé en bytecode Common Intermediate Language (CIL).Chaque fois que vous exécutez un exécutable CIL, il est exécuté sur la machine virtuelle Common Language Runtime (CLR) de Microsoft.Donc non, il n'est pas possible d'inclure la VM dans votre fichier exécutable .NET.Le runtime .NET doit être installé sur tous les ordinateurs clients sur lesquels votre programme sera exécuté.

Pour répondre à votre deuxième question, .NET est un framework, dans le sens où il s'agit d'un ensemble de bibliothèques, de compilateurs et de VM qui ne sont pas spécifiques à un langage.Vous pouvez donc coder sur le framework .NET en C#, VB, C++ et dans tout autre langage doté d'un compilateur .NET.

https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages

La page ci-dessus contient une liste de langues disposant de versions .NET, ainsi que des liens vers leurs pages.

Autres conseils

Cela fait principalement référence au fait que toutes vos allocations de mémoire sont « gérées » pour vous.Si vous utilisez du code managé, vous n'avez pas à vous soucier de libérer vos objets lorsque vous en avez terminé avec eux.Le simple fait de les laisser hors de portée signifiera que la machine virtuelle finira par reconnaître qu'il n'y a plus de références à eux et que Garbage les récupérera en renvoyant la mémoire au système.

En revanche, le code non géré « fuira » simplement à moins que vous ne libériez explicitement vos pointeurs avant de supprimer les références.

Je ne pense pas que vous soyez le seul à ne pas savoir ce qu'est .Net.Il existe déjà d'autres réponses qui devraient vous couvrir, mais je vais publier cette information pour les autres.

Pour voir ce qu'est "vraiment" .Net, allez simplement dans c:\Windows\Microsoft.Net\Framework

Vous y verrez des dossiers spécifiques à la ou aux versions que vous avez installées.Allez dans le dossier v2.0.xxxxx si vous l'avez installé par exemple.

Dans ce dossier se trouve le framework.Vous verrez essentiellement un tas de fichiers .exe et de fichiers .dll.Tous les fichiers DLL qui commencent par System.*.dll sont essentiellement le framework .Net.

Les fichiers .exe que vous verrez dans ce dossier sont des utilitaires destinés aux développeurs ainsi qu'aux compilateurs.Vous avez mentionné C#.Recherchez le fichier csc.exe.C'est votre compilateur C#.

Construire un programme est vraiment simple.Jetez le code suivant dans un fichier hello.cs.

using System;
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello world");
        }
    }

Puis sur la ligne de commande tapez> csc hello.cs

Cela vous générera un fichier .exe.Exécutez-le et il crachera évidemment « hello world ».

La ligne qui indique Console.WriteLine() appelle le Framework.La console est un objet qui réside dans l'espace de noms Système et WriteLine() est une méthode statique.

Voici le code démonté pour cette méthode Console.WriteLine() :

[HostProtection(SecurityAction.LinkDemand, UI=true)]
public static void WriteLine(string value)
{
    Out.WriteLine(value);
}

Lorsque les gens disent des choses comme « Dois-je utiliser PHP ou .Net ? » ou « Dois-je utiliser Python ou .Net », vous commencez à comprendre que ce n'est pas une bonne chose d'en discuter.Ils comparent évidemment un langage à un Framework.C# est un langage et ce n'est que l'un des nombreux langages qui peuvent être utilisés pour écrire du code sur la plate-forme .Net.Cette même méthode de Console.WriteLine() peut être invoquée à partir de C#, VB.Net, Pascal, C++, Ruby, Python, F# et de tout autre langage conçu pour fonctionner sur la plate-forme .Net.

J'espère que cela aide.

-Keith

Il est principalement utilisé pour décrire .NET car c'est le terme que Microsoft a choisi pour différencier .NET du C/C++ et d'autres langages plus anciens.Microsoft l'a choisi parce que ce n'était pas un terme habituellement associé à Java car ils ne voulaient pas souligner les similitudes entre C#/.NET et Java (plutôt que de l'appeler quelque chose comme « code machine virtuelle », ce qui le rendrait cela ressemble beaucoup plus à Java).Fondamentalement, l’utilisation du « code géré » est une terminologie axée sur le marketing plutôt que sur la technique.

Sous .NET et Visual C++ en particulier, vous pouvez avoir du code non géré et géré.Les termes font référence à la manière dont la mémoire est allouée et « gérée ».

Le code non géré serait le code C++ auquel vous êtes habitué.Allocation dynamique de mémoire et libération explicite de la mémoire.Le runtime .NET ne gère pas la mémoire pour vous, donc « non gérée ».

Le code managé, quant à lui, EST géré par le runtime.Vous allouez de la mémoire là où cela est nécessaire (en déclarant des variables, pas de l'espace mémoire) et le garbage collector d'exécution détermine quand elle n'est plus nécessaire et nettoie tout.Le garbage collector déplacera également la mémoire pour améliorer l’efficacité.Le runtime « gère » tout pour vous.

Comme je l'ai mentionné ci-dessus, il est possible d'écrire du code à la fois géré et non géré.

Non géré :

class Bar : public Foo {
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int * getFubar() { return * fubar; }
}

Géré :

public ref class Bar :  public Foo
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int ^ getFubar() { return ^ fubar; }
}

Remarquez la réf ?Cela désigne à peu près une classe gérée.Cependant, cela devient très déroutant lorsque vous mélangez les deux types de code.Par exemple, vous souhaitez enregistrer un pointeur de référence, (^) l’équivalent géré d’un pointeur, dans un contrôle Picture Box au sein de votre classe non gérée.Étant donné que le ramasse-miettes peut déplacer la mémoire, la prochaine fois que vous tenterez de déréférencer la zone d'image, elle ne pourra pas être trouvée.Le moteur d'exécution n'informe pas votre code non géré des modifications apportées à la mémoire.

Par conséquent, vous devez identifier l'objet géré en mémoire pour permettre à votre code non géré d'en garder une trace.Ensuite, il y a le déballage et toutes sortes d’autres bizarreries qui vous permettent de mélanger les deux.La complexité du code est énorme !

Officiellement, géré/non géré peut se résumer à la façon dont le code s'exécute sur la pile .NET.Cependant, si vous venez d'un milieu C++, j'espère que cela sera un peu plus pertinent pour vous.

Géré signifie que le code n'est pas compilé en code natif et s'exécute donc sous les auspices d'une machine virtuelle.Java se compile dans un format intermédiaire appelé bytecode, que la machine virtuelle Java sait interpréter et exécuter.Tous les langages .NET font une chose similaire, compilant en IL (langage intermédiaire) que le runtime .NET interprète.C'est un peu déroutant car les .NET IL ont des terminaisons de fichiers .dll et .exe.

Le terme géré s'applique généralement uniquement à .NET car Microsoft utilise ce terme.Microsoft n'utilise généralement pas le terme « machine virtuelle » en référence à un environnement d'exécution géré .NET.

Le « bytecode » (IL) de .NET est quelque peu différent du bytecode Java dans le sens où il a été explicitement conçu pour être compilé en code natif avant son exécution dans l'environnement géré, alors que Java a été conçu pour être interprété, mais le concept de code indépendant de la plate-forme est similaire.

Le « .NET Framework » est essentiellement un vaste ensemble de bibliothèques fournies par Microsoft, contenant des milliers de classes pouvant être utilisées pour développer des applications.

Un .exe C# compilé contient du code indépendant de la plate-forme qui peut être exécuté dans n'importe quel environnement compatible .NET, y compris Mono.Cependant, le runtime est généralement distribué séparément des applications qui l'utilisent.

Au risque d'offenser certains, je soupçonne que le mot géré a été utilisé pour qu'ils puissent utiliser le mot non géré au lieu de compilé.Bien que géré puisse signifier plus, la réalité est qu'il semble être utilisé principalement pour faire la distinction entre ce qui est à peu près une compilation juste à temps (en remplacement de ce qui était une fois interprété ou pcode) et le code compilé natif.

Ou, en d'autres termes, que préféreriez-vous utiliser :

a) Code non géré pouvant avoir des effets incontrôlables sur le système.

b) Code compilé natif, rapide, solide et proche de l'OS.

Bien sûr, il s’agit en réalité de la même chose.

Dans le même esprit, .NET est-il un langage ou un framework, et que signifie exactement « framework » ici ?<<

.NET est la plate-forme logicielle d'entreprise actuelle de Microsoft.Cela consiste en:

• Une interface universelle unique pour accéder aux fonctionnalités Windows :

o The .NET Framework Class Library (FCL).
o The FCL provides a rich set of high-level functionality for developers.

• Un langage et un environnement d'exécution universels uniques pour exécuter les applications .NET :

o Common Language Runtime (CLR) executes Common Intermediate Language (CIL).
o The CLR is God: it runs, controls, and polices everything.

• Le choix de plusieurs langages pour développer des applications .NET :

o Every development language is compiled to CIL, which is run by the CLR.
o C# and VB are the two main development languages.

.NET est un framework.Le Common Language Runtime (CLR) exécute le code Microsoft Intermediate Language (MSIL) généré lorsqu'une solution est compilée (c'est-à-dire qu'elle n'est pas compilée en code machine).Vous ne pouvez pas contenir l'API dans l'exe, et vous ne le voudriez pas non plus car elle est assez volumineuse.Le principal avantage ici est la gestion de la mémoire (parmi d’autres avantages en matière de sécurité et peut-être d’autres que je ne connais pas.)

Je peux répondre à la question cadre..NET est un framework, C#, VB.NET, etc. sont des langages.Fondamentalement, .NET fournit une plate-forme commune de bibliothèques à appeler (Tout le système....dll) que n’importe quel langage utilisant .NET peut appeler.Tous les langages .NET sont compilés en MSIL (Microsoft Intermediate Language, mieux connu sous le nom d'IL) qui peut ensuite être exécuté sur n'importe quel PC sur lequel le framework .NET approprié est installé.

.NET est un framework.Il peut être utilisé depuis de nombreux langages (VB.NET, C#, IronPython, boo, etc.)

.NET s'exécute toujours tel qu'interprété, et non, vous ne pouvez pas inclure la « VM » dans le .exe.Tout utilisateur souhaitant exécuter votre application .NET doit avoir le framework installé.

Il peut faire référence à n'importe quel code exécuté par une machine virtuelle plutôt que directement par le CPU.

Je pense que cela permet des choses comme le garbage collection et la vérification des limites du tableau.

Personnellement, je pense que le mot « cadre » est un peu abusif.

.NET est une « plateforme », constituée d'un environnement d'exécution (la machine virtuelle CLR) et d'un ensemble de bibliothèques.C'est exactement analogue à Java, Perl ou Python (dont aucun n'est jamais appelé « framework »).

Dans la plupart des cas, le mot « framework » est utilisé pour des projets comme Spring, Struts ou QT, qui reposent sur une plate-forme (c'est-à-dire ne fournissant aucun environnement d'exécution propre) comme une bibliothèque.

Mais contrairement à une « bibliothèque », un framework cherche à redéfinir les opérations fondamentales de la plateforme sous-jacente.(L'injection de dépendances de Spring défie la logique d'appel du constructeur du code Java ordinaire.L'implémentation des signaux et des emplacements de QT défie le code C++ ordinaire.)

Je sais que je suis juste un salaud pédant, mais pour moi, .NET n'est pas un framework.C'est une plateforme.

Code géré : MSIL, IL et le code géré sont identiques. Lorsque nous construisons notre application, les fichiers .dll ou .exe sont générés dans le dossier Bin. Ces fichiers sont appelés code géré. Plus tard, ces fichiers sont transmis au CLR pour générer des fichiers natifs. code qui serait compris par le système d’exploitation.

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