C++/native C++/CLI marshalling IntPtr

Werden Werttypen nicht auf dem globalen Heap abgelegt?

Und warum ist P-Invoke langsamer als IJW? Weil es die Sachen implizit macht, die der Entwickler bei IJW manuell machen muss (beispielsweise Pinnen).

/Edit: Und ohne Marshalling:
PInvoke has an overhead of between 10 and 30 x86 instructions per call.
 
Zuletzt bearbeitet:
Hi.
Das ist so nicht ganz richtig, bzw durch IJW werden auch solche Sachen zu Addressen die man auf den ersten Blick nicht als solche erkennt. Beispiel:

Code:
ref class Test
{
    int Wert;  // Membervariable einer managed Klasse

   void Funktion()
   {
        UnmanagedFunktion(Wert);  // Fehler
   }
};

Auf den ersten Blick übergibtst Du hier eine Variable by Value, was ja keine Adresse eines Objektes wäre. Aber, diese Variable "lebt" auf dem managed heap innerhalb der virtuellen Machine. Tatsächlich übergibt IJW hier nicht die variable, sondern den Zeiger auf die VAriable innerhalb des managed heap an eine native Funktion.
Wie kommst du denn darauf? Wie sollte denn statt eines Wertes (den die native Funktion als Parameter erwartet) eine Adresse der Variablen übergeben werden? Wie sollte das funktionieren?

Für deine Funktion wird der folgende MSIL Code generiert:
Code:
.method private hidebysig instance void  Funktion() cil managed
{
  // Code size       12 (0xc)
  .maxstack  1
  IL_0000:  ldarg.0
  IL_0001:  ldfld      int32 Test::Wert
  IL_0006:  call       void modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) UnmanagedFunktion(int32)
  IL_000b:  ret
} // end of method Test::Funktion
Wie du siehst wird der Wert der Member-Variablen auf den Stack geladen und dann wird die UnmanagedFunktion aufgerufen. Da muß bzw. kann nichts gepinnt werden.

Grundsätzlich macht es nur Sinn interior_ptr die auf Objekte auf dem managed Heap zeigen zu pinnen.
Würde jetzt die GC genau dieses Objekt verschieben während die UnmanagedFunktion ausgeführt wird, dann wäre "Wert" an einer anderen Stelle im managed Heap, der Zeiger in den die UnmanagedFunktion reinschreibt also nicht mehr gültig -> bumm.
Wo sollte die UnmanagedFunktion denn "reinschreiben"? Sie erhält als Parameter einen int (unter der Annahme das sie z.B. als void UnmanagedFunktion(int) definiert ist).

Gruß
 
Grundsätzlich ist die verwaltete Funktion ja fix, die lädt einen Integerwert vom Stack und verwendet den als Integerwert. Da kann IJW noch lange eine Adresse übergeben wollen, die Funktion akzeptiert keine Adresse als Parameter (bzw verwendet dann einfach diesen Wert als Parameter).

Danke deepthroat, ich hab mich gestern echt gefragt, ob ich jetzt da was komplett durcheinander bringe :D
 
Zurück