C ++ / CLI-C # Fehler C2526: C-Verknüpfungsfunktion kann C ++ - Klasse nicht zurückgeben

9

Ich habe eine einfache .NET-DLL, die mit VS2010 C # erstellt wurde, die zwei statische Member einer Klasse verfügbar macht

%Vor%

Ich habe dann eine Console-App von VS2010 C ++ erstellt und diese Funktion über _tmain

hinzugefügt %Vor%

Das Hinzufügen der Referenz und das Kompilieren gibt mir diesen Fehler

%Vor%

Einige meiner Beobachtungen:

  • Es kompiliert erfolgreich, wenn ich extern "C"
  • entferne
  • Es wird erfolgreich kompiliert, wenn ich Test(List<int> test) in Test2(List<int> test) umbenenne

Meine Frage ist, was schief läuft und wie man es von der C ++ Seite aus beheben kann.

Meine aktuelle Problemumgehung besteht darin, die Methode in C # umzubenennen, aber ich würde das lieber nicht tun müssen, da ich das Gefühl habe, dass es eine Einstellung gibt, die ich in meinem C ++ - Projekt vermisse.

Bearbeiten:

Ich habe eine bessere Problemumgehung in C ++ gefunden, es sieht so aus, als könnte ich die .NET-Aufrufe in eine andere Funktion einfügen.

%Vor%

Es scheint albern zu sein, dies zu tun, ich frage mich, ob es ein Compiler Bug ist? Was mir Angst macht, ist die Verwendung solcher Methoden und die Sorge, dass der C # -Entwickler zu einem späteren Zeitpunkt eine solche statische Methode hinzufügen und die C ++ - Builds auflösen könnte.

    
PeskyGnat 16.06.2011, 17:12
quelle

1 Antwort

3

Ich werde hier nur eine wilde Aufnahme machen, mit folgender Begründung:

Während der Kompilierung von MSVCs C ++ sieht der extern "C" function TestMe() eine Funktion Test() innerhalb einer Klasse Polygon . Polygon ist ein unvollständiger Typ für den Compiler. Ich nehme an, der Compiler kann nicht sehen, ob die Funktion Polygon::Test(3) einen unvollständigen Typ zurückgibt oder überhaupt zurückgibt, sie entscheidet, dass sie an dieser Stelle einen Fehler zurückgeben muss, falls der Typ kein einfacher C-Style-POD ist Geben Sie ein.

Das obige scheint eine vernünftige Annahme von MSVC zu sein, wie in (7.5 / 9 "Verbindungsspezifikationen") der C ++ Standard sagt:

"Die Verknüpfung von C ++ mit Objekten, die in anderen Sprachen definiert sind, und Objekten, die in C ++ aus anderen Sprachen definiert sind, ist implementierungsdefiniert und sprachabhängig. Nur wenn die Objektlayoutstrategien von zwei Sprachimplementierungen ähnlich genug sind, kann eine solche Verknüpfung erfolgen erreicht werden. "

Das würde erklären, dass der Fehler verschwindet, wenn Sie die extern C -Verbindungsspezifikation entfernen oder den Aufruf durch eine Cstyle-Funktion ersetzen.

    
Alok Save 16.06.2011, 17:50
quelle