Linkertoolwarnung LNK4227

Warnung bei Metadatenoperation (HRESULT): Warnmeldung

Der Linker hat bei der Zusammenführung Unterschiede in den Metadaten entdeckt:

  • Eine oder mehrere referenzierte Assemblys bei der derzeit erstellten Assembly.

  • Eine oder mehrere Quellcodedateien in einer Kompilierung.

LNK4227 kann beispielsweise auftreten, wenn zwei globale Funktionen mit dem gleichen Namen vorhanden sind, bei denen die Parameterinformationen jedoch unterschiedlich deklariert sind (wenn die Deklarationen nicht bei allen Kompiliereinheiten einheitlich sind). Wenn Sie Sie ildasm.exe /TEXT /METADATEN object_file für jede OBJ-Datei verwenden, wird deutlich, wie sehr sich die Typen voneinander unterscheiden.

LNK4227 meldet auch Probleme, die von einem anderen Tool verursacht werden. Informationen zu al.exe finden Sie beispielsweise unter Fehler und Warnungen des Al.exe-Tools.

Um die Warnung zu vermeiden, müssen die Probleme mit Metadaten behoben werden.

LNK4227 wird beispielsweise ausgegeben, wenn eine Assembly, auf die verwiesen wird, mit einer anderen Signatur versehen ist als die Assembly, die auf diese Assembly verweist.

Im folgenden Beispiel wird LNK4227 generiert:

// LNK4227.cpp
// compile with: /clr
using namespace System::Reflection;

[assembly:AssemblyDelaySignAttribute(false)];

int main() {}

und anschließend

// LNK4227b.cpp
// compile with: /clr LNK4227.cpp /FeLNK4227b.exe
using namespace System::Reflection;
using namespace System::Runtime::CompilerServices;

[assembly:AssemblyDelaySignAttribute(true)];
// Try the following line instead
// [assembly:AssemblyDelaySignAttribute(false)];

ref class MyClass
{
};

Im folgenden Beispiel wird LNK4227 generiert:

// LNK4227c.cpp
// compile with: /clr:oldSyntax
#using <mscorlib.dll>
using namespace System::Reflection;

[assembly:AssemblyDelaySignAttribute(false)];

int main() {}

und anschließend

// LNK4227d.cpp
// compile with: /clr:oldSyntax LNK4227c.cpp /FeLNK4227d.exe
#using <mscorlib.dll>
using namespace System::Reflection;
using namespace System::Runtime::CompilerServices;

[assembly:AssemblyDelaySignAttribute(true)];

__gc class MyClass
{
};

LNK4227 kann auch generiert werden, wenn Versionsnummern im falschen Format an Assemblyattribute übergeben werden. Die '*'-Notation ist für AssemblyVersionAttribute spezifisch. Diese Warnung kann vermieden werden, indem für die Versionsattribute nur Zahlen verwendet werden, die sich von AssemblyVersionAttribute unterscheiden.

Im folgenden Beispiel wird LNK4227 generiert:

// LNK4227e.cpp
// compile with: /clr /LD /W1
using namespace System::Reflection;
[assembly:AssemblyVersionAttribute("2.3.*")];   // OK
[assembly:AssemblyFileVersionAttribute("2.3.*")];   // LNK4227
// try the following line instead
// [assembly:AssemblyFileVersionAttribute("2.3")];