Compartir vía


.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 forma predeterminada, encapsula CLR excepciones que noSystem son 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