2009-06-09 18 views
5

Ich bin Schnittstelle mit einer ActiveX-Komponente, die mir eine Speicheradresse und die Anzahl der Bytes gibt.Zugriff auf die Speicheradresse in C#

Wie kann ich ein C# -Programm schreiben, das auf die Bytes ab einer bestimmten Speicheradresse zugreift? Gibt es eine Möglichkeit, dies nativ zu tun, oder muss ich mit C++ kommunizieren? Haben die ActiveX-Komponente und mein Programm denselben Speicher-/Adressraum?

Antwort

7

Ich schlage vor, dass Sie einen IntPtr und Marshal.Copy verwenden. Hier ist ein Code, um loszulegen. memAddr ist die Speicheradresse, die Sie erhalten haben, und bufSize ist die Größe.

IntPtr bufPtr = new IntPtr(memAddr); 
byte[] data = new byte[bufSize]; 
Marshal.Copy(bufPtr, data, 0, bufSize); 

benötigen Sie diese nicht unsicheren Code zu verwenden, die und die die/unsafe-Compiler-Option erfordert, ist von der CLR nicht nachprüfbar.

Wenn Sie ein Array von etwas anderem als Bytes benötigen, ändern Sie einfach die zweite Zeile. Marshal.Copy hat eine Reihe von Überladungen.

+0

Danke für das Codebeispiel; das ist, was ich am Ende benutzt habe. – chocojosh

2

Ich denke, Sie suchen nach dem IntPtr Typ. Dieser Typ (wenn in einem Block unsafe verwandt) ermöglicht es Ihnen, das Speicherhandle aus der ActiveX-Komponente zu verwenden.

10

Sie können Marshal.Copy verwenden, um die Daten aus dem nativen Speicher in ein verwaltetes Array zu kopieren. Auf diese Weise können Sie die Daten in verwaltetem Code verwenden, ohne den Code unsafe zu verwenden.

+0

Dies ist wahrscheinlich eine viel elegantere Methode als die Verwendung von unsicherem Code. Mein Programm arbeitet jetzt mit unsicherem Code; aber, ich werde es später wieder besuchen, um zu sehen, ob ich es durch Marshal ersetzen kann. Kopieren – chocojosh

1

C# kann Zeiger verwenden. Verwenden Sie einfach das Schlüsselwort 'unsafe' vor der Klasse, dem Block, der Methode oder der Member-Variablen (keine lokalen Variablen). Wenn eine Klasse als unsicher markiert wird, sind alle Mitgliedsvariablen ebenfalls nicht sicher.

unsafe class Foo 
{ 

} 

unsafe int FooMethod 
{ 

} 

Dann können Sie Zeiger verwenden, um mit * und & wie C.

Ich weiß nicht, über ActiveX-Komponenten im gleichen Adressraum.

+0

Ich endete mit dieser Lösung, nachdem ich die Frage gestellt hatte. _axetRecord1.SourceBufferMemoryPointer speichert den Speicherort des Beginns des Speicherpuffers. Der folgende Code funktioniert: [code] short * memPtr; memPtr = (kurz *) _ axetRecord1.SourceBufferMemoryPointer; [/ code] – chocojosh

+0

Sie müssen die Instanz anheften, wenn Sie sie an den systemeigenen Code übergeben möchten! –