2009-04-03 7 views
7

Ich rufe eine Methode über Interop auf, die einen out IntPtr Parameter zurückgibt. Wie kann ich eine byte* für diese IntPtr bekommen, damit ich darauf operieren kann? Ich habe versucht, die folgenden:Wie man IntPtr zu Byte umwandelt *

fixed(byte* ptr = (byte)myIntPtr) 

aber es hat nicht funktioniert. Jede Hilfe wäre willkommen!

+1

Hallo Dmitri, könnten Sie entweder weitere Informationen anfordern oder eine Antwort akzeptieren? –

Antwort

13

können Sie einfach schreiben:

byte* ptr = (byte*)int_ptr; 

Sie müssen den Stichwort Fest nicht verwenden. Du willst den IntPtr nicht anstecken, oder?

+0

Das funktioniert auch gut, obwohl ich persönlich die ToPointer-Methode mag, besonders wenn Sie nicht sofort in einen bestimmten Typ Zeiger (z. B. von void * zu Byte *) konvertieren müssen. – Noldorin

5

myIntPtr.ToPointer()

+0

Beachten Sie, dass das feste Schlüsselwort in diesem Fall nicht wirklich geeignet ist, da es verwendet wird, um das Verschieben von Variablen zu verhindern. Da IntPtr bereits ein (verwalteter) Zeiger ist, möchten Sie im Wesentlichen nur eine direkte Konvertierung zwischen den beiden Typen. Siehe auch http://msdn.microsoft.com/en-us/library/f58wzh21(VS.71).aspx – Noldorin

+2

IntPtr ist in diesem Fall * nicht * ein verwalteter Zeiger, eher ein nicht verwalteter Zeiger! –

+1

Ja, was ich wirklich meinte, ist, dass IntPtr ein verwalteter Zeiger in dem Sinne ist, dass es Teil der verwalteten Bibliotheken ist, während Byte * ein unsicherer C-artiger Zeiger ist. Vielleicht wäre "sicher" ein besseres Wort, obwohl es wichtig ist, den Unterschied zwischen IntPtr und SafeHandle zu beachten. – Noldorin

1

Wenn Sie in Ihrer Anwendung keinen unsicheren Code verwenden möchten, müssen Sie die Methoden in verwenden oder (noch besser) die Parameter der Interop-Funktionen deklarieren, damit das Marshalling automatisch erfolgt.

1

Ich wollte nicht "unsafe code" in meiner Anwendung, also habe ich Folgendes getan, um ein IntPtr in ein Byte [] zu konvertieren. Bei einer gegebenen IntPtr namens „unsafeDataBlock“:

var byteArray = new byte[dataBlockSize]; 
System.Runtime.InteropServices.Marshal.Copy(unsafeDataBlock, byteArray, 0, dataBlockSize); 
1

Dies schien für mich zu arbeiten, war ich Interop nicht verwendet wurde aber noch eine verwaltete C++ Funktion von C Sharp aufrufen. Die verwaltete C++ - Funktion hat jedoch nicht verwalteten Code aufgerufen, so dass sie das Gleiche wie Interop erreicht hat.

Wie dem auch sei, in der C++ Funktion, die von Cis genannt wurde, habe ich diesen Code:

(anyPointerType *) Zeiger = (anyPointertype *) myIntPtr.ToPointer();

+1

Nur um zu verdeutlichen, was ich meinte: " Ich war nicht mit Interop, aber rief immer noch eine verwaltete C++ - Funktion von C Sharp. Die verwaltete C++ - Funktion jedoch unmanaged Code aufgerufen, so dass es dasselbe wie Interop erreicht. " Aufruf unmanged Code durch Interop: C-Sharp - (Mit Interop Anrufen)> nicht verwalteten Code hat das gleiche Ergebnis wie Aufruf von c-sharp eines verwaltete C++ Funktion, die nicht verwalteten Code aufruft: C-Sharp - (Anrufe)> verwaltete C++ - Funktion - (Anrufe)> nicht verwalteten Code und das letztere Verfahren ist in der Regel viel einfacher –

Verwandte Themen