c# .net vb.net managed-code

c# - ¿Qué es exactamente el código "administrado"?



.net vb.net (15)

He estado escribiendo código C / C ++ durante casi veinte años, y sé Perl, Python, PHP y algo de Java también, y me estoy enseñando a mí mismo JavaScript. Pero nunca he hecho nada de .NET, VB o C #. ¿Qué significa exactamente el código administrado ?

Wikipedia lo describe simplemente como

Código que se ejecuta bajo la administración de una máquina virtual

y específicamente dice que Java es (generalmente) código administrado, por lo que

  • ¿Por qué el término solo parece aplicarse a C # / .NET?
  • ¿Puedes compilar C # en un .exe que también contenga VM, o tienes que empaquetarlo y dárselo a otro .exe (a la java)?

En un sentido similar,

  • ¿.NET es un lenguaje o un framework , y qué significa exactamente "framework" aquí?

OK, entonces esa es más de una pregunta, pero para alguien que ha estado en la industria tanto tiempo como yo, me siento más bien N00B-ish en este momento ...


En una línea similar, .NET es un lenguaje o un marco, y ¿qué significa exactamente "marco" aquí? <<

.NET es la plataforma de software empresarial actual de Microsoft. Consiste en:

• Una única interfaz universal para acceder a la funcionalidad de Windows:

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

• Un único lenguaje universal y tiempo de ejecución para ejecutar aplicaciones .NET:

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

• La elección de múltiples idiomas para desarrollar aplicaciones .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 es un marco. Common Language Runtime (CLR) ejecuta el código de Microsoft Intermediate Language (MSIL) que se genera cuando se compila una solución (es decir, no se compila con el código de máquina). No puede contener la API dentro del exe, ni tampoco le gustaría, ya que es bastante grande. El principal beneficio aquí es la administración de memoria (entre otras ventajas de seguridad y posiblemente otras que no conozco).


.NET es un marco. Se puede usar desde muchos idiomas (VB.NET, C #, IronPython, boo, etc.)

.NET siempre se ejecuta tal como se interpreta, y no se puede incluir la ''VM'' dentro del .exe. Cualquier usuario que desee ejecutar su aplicación .NET debe tener el marco instalado.


A riesgo de ofender a algunos, sospecho que se usó la palabra administrar para que pudieran usar la palabra no administrada en lugar de compilada. Si bien administrado puede significar más, la realidad es que parece ser el utilizado para distinguir principalmente entre lo que es más o menos justo compilar (como el reemplazo de lo que fue una vez interpretado o pcode) y el código compilado nativo.

O dicho de otra manera, ¿cuál preferirías usar?

a) Código no administrado que puede hacer cosas incontrolables al sistema.

b) Código compilado nativo que es rápido, sólido y está cerca del sistema operativo.

Por supuesto, son en realidad lo mismo.


Cuando compila el código C # en .exe, se compila en el código de byte del Common Intermediate Language (CIL). Cada vez que ejecuta un archivo ejecutable CIL, se ejecuta en la máquina virtual Microsoft Common Language Runtime (CLR). Entonces no, no es posible incluir la máquina virtual en su archivo ejecutable .NET. Debe tener el tiempo de ejecución de .NET instalado en las máquinas cliente donde se ejecutará su programa.

Para responder a su segunda pregunta, .NET es un marco de trabajo, ya que se trata de un conjunto de bibliotecas, compiladores y VM que no son específicos de un idioma. De modo que puede codificar en .NET Framework en C #, VB, C ++ y en cualquier otro idioma que tenga un compilador .NET.

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

La página anterior tiene una lista de idiomas que tienen versiones .NET, así como enlaces a sus páginas.


El término administrado generalmente se aplica solo a .NET porque Microsoft usa el término. Generalmente, Microsoft no usa el término "máquina virtual" en referencia a un entorno de ejecución administrado .NET.

El "bytecode" (IL) de .NET es algo diferente del bytecode de Java en que fue diseñado explícitamente para ser compilado en código nativo antes de la ejecución en el entorno administrado, mientras que Java fue diseñado para ser interpretado, pero el concepto de código independiente de la plataforma es similar.

El ".NET Framework" es básicamente un gran conjunto de bibliotecas proporcionadas por Microsoft, que contiene miles de clases que se pueden utilizar para desarrollar aplicaciones.

Un C # .exe compilado contiene un código independiente de la plataforma que se puede ejecutar en cualquier entorno compatible con .NET, incluido Mono. Sin embargo, el tiempo de ejecución generalmente se distribuye por separado de las aplicaciones que lo usan.


En .NET y Visual C ++ específicamente, puede tener tanto código administrado como no administrado. Los términos se refieren a la manera en que la memoria se asigna y ''administra''.

El código no administrado sería el material de C ++ al que estás acostumbrado. Asignación de memoria dinámica y liberación explícita de la memoria. El tiempo de ejecución .NET no administra la memoria por usted, por lo tanto ''no administrado''.

Por otro lado, el código administrado se gestiona mediante el tiempo de ejecución. Puede asignar memoria donde sea necesario (declarando variables, no espacio de memoria) y el recolector de elementos no utilizados determina cuándo ya no se necesita y lo limpia todo. El recolector de basura también moverá la memoria para mejorar la eficiencia. El tiempo de ejecución lo "administra todo" por ti.

Como mencioné anteriormente, es posible escribir código administrado y no administrado.

No administrado:

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

Administrado:

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

Observe la referencia? Eso más o menos designa una clase administrada. Sin embargo, se vuelve muy confuso cuando se mezclan los dos tipos de código. Por ejemplo, desea guardar un puntero de referencia, (^) el equivalente administrado de un puntero, en un control Picture Box dentro de su clase no administrada. Como el recolector de basura puede mover la memoria, la próxima vez que intente desreferenciar el cuadro de imagen no podrá encontrarlo. El tiempo de ejecución no le dice a su código no administrado sobre sus cambios de memoria.

Por lo tanto, necesita anclar el objeto administrado en la memoria para permitir que su código no administrado lo haga un seguimiento. Luego hay unboxing y todo tipo de otras peculiaridades que te permiten entremezclar los dos. ¡La complejidad del código es enorme!

Oficialmente, administrado / no administrado podría reducirse a la forma en que se ejecuta el código en la pila .NET. Sin embargo, si vienes de un fondo de C ++, espero que esto sea un poco más relevante para ti.


En su mayoría se refiere al hecho de que todas las asignaciones de memoria se "administran" para usted. Si está usando un código administrado, no tiene que preocuparse de liberar sus objetos cuando haya terminado con ellos. Simplemente permitiéndoles salir del alcance significará que la máquina virtual finalmente reconocerá que ya no hay referencias a ellos y que Garbage los recogerá para devolver la memoria al sistema.

Por otro lado, el código no administrado simplemente "se fugará" a menos que libere explícitamente sus punteros antes de descartar las referencias.


Gestionado significa que el código no se compila en código nativo y, por lo tanto, se ejecuta bajo los auspicios de una máquina virtual. Java compila a un formato intermedio llamado bytecode, que la máquina virtual Java sabe cómo interpretar y ejecutar. Todos los lenguajes .NET hacen algo similar, compilando a IL (lenguaje intermedio) que interpreta el tiempo de ejecución de .NET. Es un poco confuso porque .NET IL tiene terminaciones de archivos .dll y .exe.


Managed Code: MSIL, IL y Managed Code son los mismos. Cuando construimos nuestra aplicación, los archivos .dll o .exe se generan en la carpeta Bin. Estos archivos se llaman como código administrado. Luego estos archivos se entregan a CLR para generar Native. código que sería entendido por OS.


No creo que estés solo al estar confundido sobre qué es .Net. Ya hay otras respuestas que deberían tenerlo cubierto, pero voy a tirar este bocado de información para los demás.

Para ver qué es .Net "realmente", simplemente vaya a c: / Windows / Microsoft.Net / Framework

Allí verás carpetas que son específicas de la (s) versión (es) que instalaste. Vaya a la carpeta v2.0.xxxxx si lo tiene instalado, por ejemplo.

En esa carpeta está el marco. Básicamente verá un montón de archivos .exe y archivos .dll. Todos los archivos DLL que comienzan con System. *. Dll son esencialmente .Net framework.

Los archivos .exe que verá en esa carpeta son utilidades tanto para desarrolladores como para compiladores. Usted mencionó C #. Busque el archivo csc.exe. Ese es tu compilador de C #.

Crear un programa es realmente simple. Tirar el siguiente código en un archivo hello.cs.

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

Luego, en la línea de comando, escriba> csc hello.cs

Eso te generará un archivo .exe. Ejecutarlo y escupirá ''Hola mundo'' obviamente.

La línea que dice Console.WriteLine () llama al Framework. La consola es un objeto que vive dentro del espacio de nombres del sistema y WriteLine () es un método estático.

Este es el código desensamblado para ese método Console.WriteLine ():

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

Cuando la gente dice cosas como "¿Debería usar PHP o .Net?", O "¿Debo usar Python o .Net?", Empiezas a ver que eso es lo que no se debe debatir. Obviamente están comparando un idioma con un Marco. C # es un lenguaje y es solo uno de los muchos idiomas que se pueden usar para escribir código en la parte superior de la plataforma .Net. Ese mismo método de Console.WriteLine () se puede invocar desde C #, VB.Net, Pascal, C ++, Ruby, Python, F # y cualquier otro lenguaje que se haya creado para trabajar sobre la plataforma .Net.

Espero que eso ayude.

-Keith


Personalmente, creo que la palabra "marco" es un nombre poco apropiado.

.NET es una "plataforma", que consta de un entorno de ejecución (la máquina virtual CLR) y un conjunto de bibliotecas. Es exactamente análogo a Java o Perl o Python (ninguno de los cuales se conoce como "frameworks").

En la mayoría de los casos, la palabra "marco" se utiliza para proyectos como Spring o Struts o QT, que se ubican en la parte superior de una plataforma (es decir, que no proporcionan un entorno de ejecución propio) como una biblioteca.

Pero a diferencia de una "biblioteca", un marco busca redefinir las operaciones fundamentales de la plataforma subyacente. (La inyección de dependencia de Spring desafía la lógica de llamada del constructor del código Java común. La implementación de señales y ranuras de QT desafía el código ordinario de C ++).

Sé que solo estoy siendo un bastardo pedante, pero para mí, .NET no es un marco. Es una plataforma.


Puede referirse a cualquier código ejecutado por una máquina virtual en lugar de referirse directamente a la CPU.

Creo que esto permite cosas como recolección de basura y comprobación de límites de matriz.


Puedo responder la pregunta sobre el marco. .NET es un framework, C #, VB.NET, etc. son idiomas. Básicamente .NET proporciona una plataforma común de bibliotecas para llamar (All the System .... dlls) que cualquier lenguaje que use .NET pueda llamar. Todos los lenguajes .NET están compilados en MSIL (Microsoft Intermediate Language, más conocido como solo IL) que luego se puede ejecutar en cualquier PC con el .NET framework apropiado instalado.


Se usa principalmente para describir .NET porque ese es el término que Microsoft eligió para diferenciar .NET de C / C ++ y otros lenguajes más antiguos. Microsoft lo eligió porque no era un término que generalmente se asociaba con Java porque no deseaba enfatizar las similitudes entre C # / .NET y Java (en lugar de llamarlo algo así como ''código de máquina virtual'' que lo haría suena mucho más como Java). Básicamente, el uso de "código administrado" es terminología impulsada por el marketing, en lugar de técnicamente.