Freigeben über


Linkertoolfehler LNK2022

Fehler bei Metadatenoperation (HRESULT): Fehlermeldung

Der Linker hat beim Zusammenführen von Metadaten einen Fehler ermittelt. Um eine erfolgreiche Verknüpfung zu gewährleisten, müssen die Metadatenfehler aufgelöst werden.

In diesem Fall können Sie eine Fehlerdiagnose durchführen, indem Sie ildasm –tokens für die Objektdateien auszuführen. Suchen Sie nach den Typen, deren Token in error_message aufgeführt sind, und vergleichen Sie diese. In den Metadaten sind zwei verschiedene Typen mit demselben Namen ungültig – auch dann, wenn lediglich das Layouttyp-Attribut verschieden ist.

LNK2022 wird z. B. ausgegeben, wenn ein Typ (z. B. eine Struktur) in mehreren Kompiliereinheiten mit demselben Namen vorhanden ist, die jedoch miteinander in Konflikt stehende Definitionen enthalten, und wenn Sie die Kompilierung mit /clr durchführen. Stellen Sie in diesem Fall sicher, dass der Typ in allen Kompiliereinheiten identisch definiert ist. Der Typname wird in error_message aufgeführt.

Eine weitere mögliche Ursache für LNK2022 besteht darin, dass vom Linker eine Metadatendatei an einem Speicherort erkannt wird, der sich von dem Speicherort unterscheidet, der für den Compiler angegeben wurde (mit #using). Stellen Sie sicher, dass die Metadatendatei (.dll oder . netmodule) sich bei der Übergabe an den Linker an demselben Speicherort befindet wie bei der der Übergabe an den Compiler.

Wenn Sie eine ATL-Anwendung erstellen und in wenigstens einer Kompiliereinheit _ATL_MIXED verwenden, müssen Sie _ATL_MIXED in jeder Kompiliereinheit verwenden.

Beispiel

Im folgenden Beispiel wird ein leerer Typ definiert.

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

In diesem Beispiel wird verdeutlicht, dass zwei Quellcodedateien nicht verknüpft werden können, wenn diese Dateien Typen mit gleichem Namen aber verschiedenen Definitionen enthalten.

Im folgenden Beispiel wird LNK2022 generiert.

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