Pregunta

He estado escribiendo código C/C++ durante casi veinte años, conozco Perl, Python, PHP y algo de Java también, y estoy aprendiendo JavaScript por mi cuenta.Pero nunca he hecho nada de .NET, VB o C#.¿Qué hace exactamente? administrado ¿Qué significa el código?

Wikipedia lo describe simplemente como

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

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

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

En un sentido similar,

  • ¿Es .NET un idioma o un estructura, ¿Y qué significa exactamente aquí "marco"?

Bien, eso es más de una pregunta, pero para alguien que ha estado en la industria tanto tiempo como yo, me siento bastante N00B en este momento...

¿Fue útil?

Solución

Cuando compila código C# en un archivo .exe, se compila en un código de bytes de lenguaje intermedio común (CIL).Siempre que ejecuta un ejecutable CIL, se ejecuta en la máquina virtual Common Language Runtime (CLR) de Microsoft.Entonces no, no es posible incluir la VM dentro de su archivo ejecutable .NET.Debe tener instalado el tiempo de ejecución .NET en cualquier máquina cliente donde se ejecutará su programa.

Para responder a su segunda pregunta, .NET es un marco, en el sentido de que es un conjunto de bibliotecas, compiladores y máquinas virtuales que no son específicos del lenguaje.Por lo tanto, puede codificar en .NET framework en C#, VB, C++ y cualquier otro lenguaje 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.

Otros consejos

Principalmente se refiere al hecho de que todas sus asignaciones de memoria están "administradas" por usted.Si está utilizando código administrado, no tiene que preocuparse por liberar sus objetos cuando haya terminado con ellos.Simplemente permitir que salgan del alcance significará que la VM eventualmente reconocerá que ya no hay referencias a ellos y los recolectará como basura y devolverá la memoria al sistema.

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

No creo que sea el único que esté confundido acerca de qué es .Net.Ya hay otras respuestas que deberían cubrirlo, pero dejaré este dato para otros.

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

Allí verá carpetas que son específicas de las versiones que ha instalado.Vaya a la carpeta v2.0.xxxxx si la tiene instalada, por ejemplo.

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

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

Crear un programa es realmente sencillo.Introduzca 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 le generará un archivo .exe.Ejecútelo y obviamente escupirá "hola mundo".

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 "¿Debería usar Python o .Net?", empiezas a ver que no es correcto discutir eso.Obviamente están comparando un lenguaje con un Framework.C# es un lenguaje y es solo uno de los muchos lenguajes que se pueden usar para escribir código sobre 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 funcionar sobre la plataforma .Net.

Espero que eso ayude.

-Keith

Se utiliza 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 normalmente se asociaba con Java porque no querían enfatizar las similitudes entre C#/.NET y Java (en lugar de llamarlo algo así como "código de máquina virtual", lo que lo haría suena mucho más parecido a Java).Básicamente, el uso de "código administrado" es una terminología impulsada por el marketing, más que por la técnica.

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

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 de .NET no administra la memoria por usted, por lo tanto, está "no administrado".

El código administrado, por otro lado, ES administrado por el tiempo de ejecución.Usted asigna memoria cuando es necesario (declarando variables, no espacio de memoria) y el recolector de basura en tiempo de ejecución determina cuándo ya no es necesaria 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 usted.

Como mencioné anteriormente, es posible escribir código tanto administrado como 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; }
}

¿Notas el árbitro?Eso prácticamente designa una clase administrada.Sin embargo, se vuelve muy confuso cuando mezclas los dos tipos de código.Por ejemplo, desea guardar un puntero de referencia (^), el equivalente administrado de un puntero, en un control Cuadro de imagen dentro de su clase no administrada.Dado que el recolector de basura puede mover la memoria, la próxima vez que intente eliminar la referencia al cuadro de imagen no podrá encontrarlo.El tiempo de ejecución no le informa a su código no administrado sobre sus cambios de memoria.

Por lo tanto, es necesario fijar el objeto administrado en la memoria para permitir que el código no administrado realice un seguimiento del mismo.Luego está el unboxing y todo tipo de peculiaridades que te permiten mezclar 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 tienes experiencia en C++, espero que esto sea un poco más relevante para ti.

Administrado 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 se compila en un formato intermedio llamado código de bytes, que Java VM sabe cómo interpretar y ejecutar.Todos los lenguajes .NET hacen algo similar: compilan en 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.

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

El "código de bytes" (IL) de .NET es algo diferente del código de bytes de Java en que fue diseñado explícitamente para ser compilado en código nativo antes de su 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.

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

Un .exe de C# compilado contiene 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 utilizan.

A riesgo de ofender a algunos, sospecho que la palabra administrado se usó para que pudieran usar la palabra no administrado en lugar de compilado.Si bien administrado puede significar más, la realidad es que parece usarse para distinguir principalmente entre lo que se compila prácticamente a tiempo (como reemplazo de lo que alguna vez fue interpretado o código p) 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 cercano al sistema operativo.

Por supuesto, en realidad son lo mismo.

De manera similar, ¿es .NET 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 lenguajes 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 lenguaje intermedio de Microsoft (MSIL) que se genera cuando se compila una solución (es decir, no se compila en código de máquina).No puede contener la API dentro del archivo ejecutable, ni desearía hacerlo, ya que es bastante grande.El principal beneficio aquí es la administración de la memoria (entre algunas otras ventajas de seguridad y posiblemente otras que no conozco).

Puedo responder a la pregunta marco..NET es un marco, C#, VB.NET, etc. son lenguajes.Básicamente, .NET proporciona una plataforma común de bibliotecas para llamar (Todo el sistema....dlls) que cualquier lenguaje que use .NET puede llamar.Todos los lenguajes .NET están compilados en MSIL (lenguaje intermedio de Microsoft, más conocido simplemente como IL) que luego se puede ejecutar en cualquier PC con el marco .NET apropiado instalado.

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

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

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

Creo que esto permite cosas como la recolección de basura y la verificación de límites de matrices.

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, Perl o Python (ninguno de los cuales se denomina "frameworks").

En la mayoría de los casos, la palabra "marco" se usa para proyectos como Spring o Struts o QT, que se ubican en la parte superior de una plataforma (es decir, que no proporcionan ningún 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 al constructor del código Java ordinario.La implementación de señales y ranuras de QT desafía el código C++ ordinario).

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

Código administrado: MSIL e IL y el código administrado son iguales. Cuando creamos nuestra aplicación, los archivos .dll o .exe se generan en la carpeta Bin. Estos archivos se denominan código administrado. Posteriormente, estos archivos se entregan a CLR para generar nativos. código que sería entendido por el sistema operativo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top