byte[] als ref byte

zosik

Grünschnabel
Hallo zusammen,

ich muss in meiner C#- Application verschiedene COM-Schnittstellen verwenden, unter anderem auch eine Methode, die als Argumenten ref byte und ref uint ewartet, also
Code:
writeToStream(ref byte Stream, ref uint size)

Dabei heißt es in der Doku, dass Stream ein byte array ist, in welches die Daten dann geschrieben werden.

Die Frage ist also, wie bekomme ich ref byte aus einem byte[] ?

Danke für die Hilfe!
 
Kannst du uns auch sagen welche COM-Schnitstellen du verwendest? Dann könnte man sich die Docs auch selbst mal anscheuen. ;)

Ich glaube, dass ich dich nicht ganz verstehe. Du postest eine Methoden-Signatur die als erstes Argument ein Byte by reference entgegen nimmt. Nirgends sehe ich ein Byte-Array. Und wieso willst du ein Byte aus einem Byte-Array bekommen?

Der Aufruf müsste im wesentlichen folgendermaßen aussehen:

C#:
byte myByte = 47;
uint myUint = 11;
writeToStream(ref byte Stream, ref uint size)

Nach dem Aufruf hätten myByte und myUnit einen anderen Wert.
 
Vielen Dank für die Antwort!

byte array muss ich selber in meiner c# application erstellen, um den Speicherplatz zu reservieren. Die Methode kriegt vermutlich ein Verweis auf byte[] und wird den Speicherplatz mit den Daten füllen. Das Problem ist nur, dass die Methode ref byte erwartet und kein byte * oder byte[] !
 
Hallo zosik,

woher stammt denn die Methoden-Signatur "writeToStream(ref byte Stream, ref uint size)"? Dass du damit den gewünschten Zweck nicht erreichen kannst ist offensichtlich. Falls das von einem DllImport ...] stammt, muss dort die Signatur korrigiert werden.

Gruß
MCoder
 
Hallo MCoder,

woher stammt denn die Methoden-Signatur "writeToStream(ref byte Stream, ref uint size)"?

diese Methode stammt aus einer COM-Schnittstelle, die mir zur Verfügung gestellt wurde. Ich kann nichts an dieser Schnittstelle ändern. C++ - Methode, die hinter dieser Schnittstelle steht, hat folgende Signatur (idl) :
Code:
HRESULT WriteToStream([in] byte *Stream, [in,out] UINT* pSize);
 
Hmm, ausgehend von der C++ - Methode müsste die C# - Methode eigentlich eher so aussehen:
C#:
writeToStream(byte [] stream, ref uint size)
Im Zusammenhang mit C# habe ich noch keine COM-DLLs verwendet und kenne mich da nicht weiter aus. Wie kommt man denn von der C++ - Signatur zur C# - Signatur ?

Gruß
MCoder
 
Hi.
Hmm, ausgehend von der C++ - Methode müsste die C# - Methode eigentlich eher so aussehen:
C#:
writeToStream(byte [] stream, ref uint size)
Im Zusammenhang mit C# habe ich noch keine COM-DLLs verwendet und kenne mich da nicht weiter aus. Wie kommt man denn von der C++ - Signatur zur C# - Signatur ?
Der Code war nicht direkt C++ sondern IDL.

Daraus erzeugt der MIDL Compiler eine Type Library (tlb).

Aus der TLB erzeugt tlbimp dann eine .NET Assembly DLL.

Das Problem ist, das der MIDL Compiler die Information, dass es sich um ein Array bei dem Parameter handelt nicht in die TLB übersetzen kann.

Man muss tatsächlich die DLL neu erzeugen indem man den Code disassembliert, die Signatur ändert und letztlich wieder zusammenbaut.

Siehe http://msdn.microsoft.com/en-us/lib...itingmicrosoftintermediatelanguagemsilanchor1

Gruß
 
Müsste es nicht reichen per Marshal (statische Methode fehlt mir grad nicht ein, irgendwas mit Alloc ^^) den Speicherplatz des Array zu allozieren und ein IntPtr zu übergeben?
Und dieses dann halt später wieder auslesen.
 
Müsste es nicht reichen per Marshal (statische Methode fehlt mir grad nicht ein, irgendwas mit Alloc ^^) den Speicherplatz des Array zu allozieren und ein IntPtr zu übergeben?
Und dieses dann halt später wieder auslesen.
Dann probiere das mal. Wie überzeugst du denn den Compiler das es OK ist, wenn du statt "ref byte" ein IntPtr übergibst? ;-]

Gruß
 

Neue Beiträge

Zurück