Linkertoolfehler LNK2031

p/invoke konnte nicht für "Funktionsdeklaration" "ergänzter_Name" generiert werden. In den Metadaten fehlt die Aufrufkonvention

Wenn eine systemeigene Funktion in ein reines Abbild importiert wird, unterscheiden sich die impliziten Aufrufkonventionen zwischen systemeigenen und reinen Kompilierungen. Weitere Informationen zu reinen Bildern finden Sie unter Reiner und überprüfbarer Code.

Beispiel

In diesem Codebeispiel wird eine Komponente mit einer exportierten, systemeigen Funktion generiert, deren Aufrufkonvention implizit __cdecl ist.

// LNK2031.cpp
// compile with: /LD
extern "C" {
   __declspec(dllexport) int func() { return 3; }
};

Im folgenden Beispiel wird ein reiner Client erstellt, der die systemeigene Funktion verwendet. Die Aufrufkonvention unter /clr:pure lautet jedoch __clrcall. Im folgenden Beispiel wird LNK2031 generiert.

// LNK2031_b.cpp
// compile with: /clr:pure LNK2031.lib
// LNK2031 expected
extern "C" int func();

int main() {
   return func();
}

Das folgende Beispiel zeigt, wie die systemeigene Funktion in einem reinen Bild verwendet wird. Beachten Sie den expliziten __cdecl-Spezifizierer der Aufrufkonvention.

// LNK2031_c.cpp
// compile with: /clr:pure LNK2031.lib
extern "C" int __cdecl func();

int main() {
   return func();
}