Compartir a través de


.netmodule archivos como entrada del enlazador

link.exe acepta MSIL .obj y.netmodule como archivos de entrada. El archivo de salida generado por el enlazador es un ensamblado o un archivo .netmodule sin ninguna dependencia en tiempo de ejecución de cualquier otro archivo .obj o .netmodule que se han introducido en el enlazador.

Comentarios

Los archivos .netmodule se crean mediante el compilador de MSVC con /LN (Crear un módulo MSIL) o mediante el enlazador con /NOASSEMBLY (Crear un módulo MSIL). Los archivos .obj siempre se crean en una compilación de Visual C++. Para otros compiladores de Visual Studio, use la opción /target:module del compilador.

El enlazador debe pasarse al archivo.obj de la compilación de C++ que creó .netmodule. Ya no se admite pasar .netmodule porque las opciones del compilador /clr:pure y /clr:safe han quedado en desuso en Visual Studio 2015 y no se admiten en Visual Studio 2017 y versiones posteriores.

Para obtener información sobre cómo invocar el enlazador desde la línea de comandos, vea Sintaxis de la línea de comandos del enlazador y Uso del conjunto de herramientas de MSVC desde la línea de comandos.

Si se pasa al enlazador un archivo .netmodule o .dll que se compiló mediante el compilador de MSVC con /clr puede producirse un error. Para más información, vea Elección del formato de losnetmodule archivos de entrada.

El enlazador acepta los archivos nativos .obj y los archivos MSIL .obj compilados con /clr. Puede pasar los archivos mixtos .obj a la misma compilación. La verificabilidad predeterminada del archivo de salida resultante es la misma que la del módulo de entrada más bajo.

Puede cambiar una aplicación compuesta por dos o más ensamblados que se incluya en solo un ensamblado. Vuelva a compilar los orígenes de los ensamblados y, a continuación, vincule los archivos .obj o .netmodule para generar un único ensamblado.

Debe especificar un punto de entrada mediante /ENTRY (Símbolo de punto de entrada) al crear una imagen ejecutable.

Al vincular con el archivo MSIL .obj o.netmodule, use /LTCG (Generación de código en tiempo de vínculo), en caso contrario, cuando el enlazador encuentre los archivos MSIL .obj o.netmodule, reiniciará el vínculo con /LTCG. Verá un mensaje informativo de que el vínculo se está reiniciando. Puede omitir este mensaje, pero para mejorar el rendimiento del enlazador, especifique explícitamente /LTCG.

Los archivos MSIL .obj o.netmodule también se pueden pasar a cl.exe.

Los archivos de entrada MSIL .obj o.netmodule no pueden tener recursos incrustados. Inserte los recursos en un módulo de salida o en un archivo de ensamblado mediante la opción del enlazador /ASSEMBLYRESOURCE (Insertar un recurso administrado). O bien, use la opción del compilador /resource en otros compiladores de Visual Studio.

Ejemplos

En el código de C++, se invocará el bloque catch correspondiente a try que invocará una no System excepción. Sin embargo, de manera predeterminada, el CLR encapsula las que no son System excepciones con RuntimeWrappedException. Cuando se crea un ensamblado desde módulos de C++ y distintos de éstos y quiere que se invoque un bloque catch en el código de C++ desde su cláusula correspondiente trycuando el bloque tryproduce una excepción que no es del sistemaSystem, debe agregar el atributo [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)] al código fuente para los módulos que no son de C++.

// MSIL_linking.cpp
// compile with: /c /clr
value struct V {};

ref struct MCPP {
   static void Test() {
      try {
         throw (gcnew V);
      }
      catch (V ^) {
         System::Console::WriteLine("caught non System exception in C++ source code file");
      }
   }
};

/*
int main() {
   MCPP::Test();
}
*/

Al cambiar el valor Boolean del atributo WrapNonExceptionThrows, modifica la capacidad del código Visual C++ de detectar una no excepción System.

// MSIL_linking_2.cs
// compile with: /target:module /addmodule:MSIL_linking.obj
// post-build command: link /LTCG MSIL_linking.obj MSIL_linking_2.netmodule /entry:MLinkTest.Main /out:MSIL_linking_2.exe /subsystem:console
using System.Runtime.CompilerServices;

// enable non System exceptions
[assembly:RuntimeCompatibility(WrapNonExceptionThrows=false)]

class MLinkTest {
   public static void Main() {
      try {
         MCPP.Test();
      }
      catch (RuntimeWrappedException) {
         System.Console.WriteLine("caught a wrapped exception in C#");
      }
   }
}
caught non System exception in C++ source code file

Consulte también