Udostępnij za pomocą


Błąd narzędzi konsolidatora LNK2022

operacja metadanych nie powiodła się (HRESULT): error_message

Konsolidator wykrył błąd podczas scalania metadanych. Aby pomyślnie połączyć błędy metadanych, należy rozwiązać problem.

Jednym ze sposobów zdiagnozowania tego problemu jest uruchomienie tokenów ildasm na plikach obiektów w celu znalezienia typów, które mają tokeny wymienione w error_messagepliku i poszukaj różnic. W metadanych dwa różne typy o tej samej nazwie są nieprawidłowe, nawet jeśli atrybut LayoutType jest inny.

Jedną z przyczyn LNK2022 jest to, że typ (taki jak struktura) istnieje w wielu współzadaniach o tej samej nazwie, ale z definicjami powodujących konflikt i podczas kompilowania z /clr. W takim przypadku upewnij się, że typ ma identyczną definicję we wszystkich kompilands. Nazwa typu znajduje się na liście .error_message

Inną możliwą przyczyną LNK2022 jest znalezienie pliku metadanych w innej lokalizacji niż określono kompilatorowi przy użyciu #using. Upewnij się, że plik metadanych (.dll lub .netmodule) znajduje się w tej samej lokalizacji po przekazaniu do konsolidatora, tak jak w przypadku przekazania go do kompilatora.

Podczas kompilowania aplikacji ATL użycie makra _ATL_MIXED jest wymagane we wszystkich kompilands, jeśli jest ono używane w co najmniej jednym.

Przykłady

Poniższy przykład definiuje pusty typ.

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

W tym przykładzie pokazano, że nie można połączyć dwóch plików kodu źródłowego, które zawierają typy o tej samej nazwie, ale różne definicje.

Poniższy przykład generuje LNK2022.

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