簡體   English   中英

從進程C ++ COM到C#中獲取字節數組

[英]Getting a byte array from out of process C++ COM to C#

從COM服務器到C#獲取一塊內存(即void *)的最佳方法是什么?

我們一直在使用IStream(使用CreateStreamOnHGlobal)並將其傳遞回去,這是可行的。 但是,當我們在使用x32 C ++ COM的x64 CLR上嘗試此操作時,它會崩潰。

COM必須為x32,因為它使用外部32位DLL。 C#可能被迫運行32位,但是面臨的挑戰是使該C#運行為x64。

回答我自己的問題。

當您從自己的COM服務器返回IStream時,.NET互操作DLL會將IStream放入其接口中。 例如,假設類型庫是MyComServer,則互操作將包含類MyComServer.Interop.IStream。

此IStream類具有函數如RemoteRead,RemoteWrite等。這些函數將ref字節作為第一個參數。 使用這些在32bit到32bit上可以正常工作,但是該ref可能成為指針,因此在64到32上出了點問題。

解決方案是使用“ as”(或可能只是強制轉換)將MyComServer.Interop.IStream轉換為System.Runtime.InteropServices.ComTypes.IStream。 然后,這將使用更熟悉的byte [],int計數和IntPtr作為返回大小。

IntPtr很煩人,因為它可能是out int,但是我用過(手動鍵入,所以不檢查編譯器。)

byte[] buffer = new byte[100];
IntPtr ptr = Marshall.AllocHGlobal( sizeof(int) );
stream.Read( buffer, 100, ptr );

如果您具有.NET 3.5,請查看System.IO.Pipes-創建一個眾所周知的管道名稱,並使用Win32命名管道API從非托管代碼中注入它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM