Partager via


Erreur des outils Éditeur de liens LNK2022

échec de l’opération de métadonnées (HRESULT) : error_message

L’éditeur de liens a détecté une erreur lors de la fusion des métadonnées. Les erreurs de métadonnées doivent être résolues pour établir un lien.

Une façon de diagnostiquer ce problème consiste à exécuter ildasm -tokens sur les fichiers objet pour rechercher quels types ont les jetons répertoriés dans error_message, et rechercher des différences. Dans les métadonnées, deux types différents portant le même nom ne sont pas valides, même si l’attribut LayoutType est différent.

Une raison pour LNK2022 est lorsqu’un type (tel qu’un struct) existe dans plusieurs compilations portant le même nom, mais avec des définitions en conflit et lorsque vous compilez avec /clr. Dans ce cas, vérifiez que le type a une définition identique dans toutes les compilations. Le nom du type est répertorié dans error_message.

Une autre cause possible pour LNK2022 est lorsque l’éditeur de liens trouve un fichier de métadonnées dans un autre emplacement que celui spécifié au compilateur (avec #using ). Assurez-vous que le fichier de métadonnées (.dll ou .netmodule) se trouve dans le même emplacement lorsqu’il est passé à l’éditeur de liens, car il a été passé au compilateur.

Lors de la création d’une application ATL, l’utilisation de la macro _ATL_MIXED est requise dans toutes les compilations, si elle est utilisée dans au moins une.

Exemples

L’exemple suivant définit un type vide.

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

Cet exemple montre que vous ne pouvez pas lier deux fichiers de code source qui contiennent des types de même nom, mais des définitions différentes.

L’exemple suivant génère LNK2022.

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