.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 try
cuando el bloque try
produce 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