Errore degli strumenti del linker LNK2022

operazione di metadati non riuscita (HRESULT): error_message

Il linker ha rilevato un errore durante l'unione dei metadati. Gli errori dei metadati devono essere risolti per il collegamento.

Un modo per diagnosticare questo problema consiste nell'eseguire ildasm -token nei file oggetto per trovare i tipi con i token elencati in error_messagee cercare le differenze. Nei metadati, due tipi diversi con lo stesso nome non sono validi, anche se l'attributo LayoutType è diverso.

Un motivo per LNK2022 è quando un tipo (ad esempio uno struct) esiste in più compilands con lo stesso nome, ma con definizioni in conflitto e quando si esegue la compilazione con /clr. In questo caso, assicurarsi che il tipo abbia una definizione identica in tutte le compilands. Il nome del tipo è elencato in error_message.

Un'altra possibile causa per LNK2022 è quando il linker trova un file di metadati in un percorso diverso da quello specificato al compilatore (con #using ). Assicurarsi che il file metadati (con estensione dll o netmodule), quando viene passato al linker, si trovi nello stesso percorso di quando è stato passato al compilatore.

Quando si compila un'applicazione ATL, l'uso della macro _ATL_MIXED è necessario in tutte le aree di compilands, se viene usato in almeno uno.

Esempi

L'esempio seguente definisce un tipo vuoto.

// LNK2022_a.cpp
// compile with: /clr /c
public ref class Test {};

Questo esempio mostra che non è possibile collegare due file di codice sorgente contenenti tipi con lo stesso nome ma definizioni diverse.

L'esempio seguente genera LNK2022.

// LNK2022_b.cpp
// compile with: LNK2022_a.cpp /clr /LD
// LNK2022 expected
public ref class Test {
   void func() {}
   int var;
};