Ich arbeite an der Portierung einiger C++ - Code auf Managed .NET. Ich werde einige C++ - Code in nativer Form beibehalten und versuchen, einen IJW-Ansatz zu verwenden. Ich weiß, dass es möglich ist, eine nicht verwaltete Struktur zu deklarieren, so dass sie ordnungsgemäß in .NET-Code gemarshallt wird, aber der C++ - Compiler scheint es nicht zu tun.IJW: verwaltete Proxy-Struktur?
Zum Beispiel habe ich diesen Code haben (verwaltet):
struct MyStruct
{
int some_int;
long some_long;
};
public ref class Class1
{
static MyStruct GetMyStruct()
{
MyStruct x = { 1, 1 };
return x;
}
};
Es kompiliert, aber wenn ich sehe es Reflektor, Code sieht wie folgt aus:
public class Class1
{
// Methods
private static unsafe MyStruct GetMyStruct()
{
MyStruct x;
*((int*) &x) = 1;
*((int*) (&x + 4)) = 1;
return x;
}
}
[StructLayout(LayoutKind.Sequential, Size=8), NativeCppClass,
MiscellaneousBits(0x41), DebugInfoInPDB]
internal struct
{
}
Grundsätzlich keine Felder in MyStruct ist für .NET sichtbar. Gibt es eine Möglichkeit, dem C++ - Compiler mitzuteilen, dass er einen generiert?
Wenn Sie antworten, beachten Sie bitte diese: Ich weiß, wie Sie eine verwaltete Klasse erstellen, die für .NET Framework sichtbar sein könnte. Ich bin daran NICHT interessiert. Was ich will, ist für die C++ Compiler nicht verwaltete Struktur in einer Art und Weise zu erklären, dass .NET es verstehen, so etwas wie:
[StructLayout(LayoutKind::Sequential, blablabla ...)]
struct MyStruct
{
[MarshalAs ....... ]
System::Int32 some_int;
[MarshalAs ....... ]
System::Int32 some_long;
};
Ja, aber das macht die Struktur verwaltet. Die Frage bezieht sich speziell auf den Zugriff auf Member von nativen Strukturen in C#. – Derrick
@Derrick - Hmmm ... es war mir nicht klar, jedenfalls habe ich meine Antwort aktualisiert. –
Danke. So mache ich es jetzt. Die Verwendung eines Pakets von 1 auf beiden Seiten ergibt identische Speicherlayouts, was es mir ermöglicht, einen Zeiger auf die nicht gemankte C++/CLI-Struktur zu erhalten und sie in die C# -Struktur zu werfen. Die Schande hier, und ich denke, was der Fragesteller versucht zu bekommen, ist, dass es Code-Duplizierung gibt, die zu Problemen der Wartbarkeit führt. Sie könnten die Struktur auch zweimal in C++ als verwaltete und nicht verwaltete Version deklarieren und dort das Casting durchführen, das Sie zumindest von unsicheren Blöcken in C# entfernt. Ich denke, dass irgendeine Form der Codegenerierung die einzige Lösung sein kann. – Derrick