Condividi tramite


.File con estensione netmodule come input del linker

Aggiornamento: novembre 2007

link.exe accetta adesso come input i file obj e netmodule di MSIL. Il file di output generato dal linker sarà un file assembly o netmodule senza alcuna dipendenza in fase di esecuzione da file obj o netmodule forniti al linker.

I file netmodule vengono creati dal compilatore Visual C++ con /LN (Crea modulo MSIL) oppure dal linker con /NOASSEMBLY (Crea un modulo MSIL). I file obj vengono sempre creati in una compilazione Visual C++. Per altri compilatori di Visual Studio, utilizzare l'opzione del compilatore /target:module.

Nella maggior parte dei casi è necessario passare al linker il file obj dalla compilazione Visual C++ che ha creato il file netmodule, a meno che quest'ultimo non sia stato creato con /clr (Compilazione Common Language Runtime). I file netmodule di MSIL utilizzati come input per il linker devono essere file pure, ovvero file che possono essere generati dal compilatore Visual C++ utilizzando /clr:safe. Altri compilatori di Visual Studio generano moduli pure di MSIL per impostazione predefinita.

Per informazioni su come richiamare il linker dalla riga di comando, vedere Sintassi della riga di comando del linker e Impostazione delle variabili di percorso e di ambiente per la generazione dalla riga di comando.

Se al linker viene passato un file netmodule o dll compilato dal compilatore Visual C++ con /clr o /clr:pure, è possibile che si verifichi un errore del linker. Per ulteriori informazioni, vedere Scelta del formato dei file di input con estensione netmodule.

Il linker accetta file obj nativi e file obj di MSIL compilati con /clr, /clr:pure o /clr:safe. Quando nella stessa build vengono passati file obj misti, la verificabilità del file di output risultante sarà, per impostazione predefinita, uguale al livello minimo di verificabilità dei moduli di input. Ad esempio, se al linker viene passato un file obj pure sicuro, il file di output sarà un file pure. /CLRIMAGETYPE (Specifica il tipo di immagine CLR) consente di specificare, se necessario, un livello di verificabilità più basso.

Se si dispone di un'applicazione composta da due o più assembly e si desidera che l'applicazione sia contenuta in uno degli assembly, è necessario ricompilare gli assembly e collegare quindi i file obj o netmodule per generare un singolo assembly.

Quando si crea un'immagine eseguibile, è necessario specificare un punto di ingresso utilizzando /ENTRY (Simbolo del punto di ingresso).

Quando si esegue un collegamento con un file obj o netmodule di MSIL, utilizzare /LTCG (Generazione di codice in fase di collegamento), altrimenti, quando viene rilevato il file, il linker riavvia il collegamento con /LTCG.

I file obj e netmodule di MSIL possono essere passati anche a cl.exe.

I file obj e netmodule di input di MSIL non possono avere risorse incorporate. Una risorsa viene incorporata in un file di output (modulo o assembly) con l'opzione del linker /ASSEMBLYRESOURCE (Incorpora una risorsa gestita) o con l'opzione del compilatore /resource in altri compilatori di Visual Studio.

Quando si eseguono collegamenti MSIL, e non viene specificato anche /LTCG (Generazione di codice in fase di collegamento), viene visualizzato un messaggio in cui si segnala che il collegamento viene riavviato. Sebbene sia possibile ignorare il messaggio, per migliorare le prestazioni del linker con i collegamenti MSIL è opportuno specificare /LTCG in modo esplicito.

Esempio

Nel codice C++ verrà richiamato il blocco catch di un blocco try corrispondente per un'eccezione non di sistema. Tuttavia, per impostazione predefinita, CLR include le eccezioni non di sistema con RuntimeWrappedException. Quando viene creato un assembly dai moduli Visual C++ e non Visual C++ e si desidera che un blocco catch nel codice C++ venga richiamato dalla clausola try corrispondente alla generazione di un'eccezione non di sistema da parte del blocco try, sarà necessario aggiungere

l'attributo [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)] al codice sorgente per i moduli non 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();
}
*/

Se si modifica il valore booleano dell'attributo WrapNonExceptionThrows, verrà modificata la capacità del codice Visual C++ di rilevare un'eccezione non di sistema.

// 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

Vedere anche

Riferimenti

File di input di LINK

Opzioni del linker