gpt4 book ai didi

c# - 从进程外 C++ COM 获取字节数组到 C#

转载 作者:太空宇宙 更新时间:2023-11-03 14:34:07 28 4
gpt4 key购买 nike

从 COM 服务器到 C# 获取内存块(即 void*)的最佳方法是什么?

我们一直在使用 IStream(使用 CreateStreamOnHGlobal)并将其传回,这很有效。然而,当我们在带有 x32 C++ COM 的 x64 CLR 上尝试这个时,它爆炸了。

COM 必须是 x32,因为它使用外部 32 位 DLL。 C# 可能被迫运行 32 位,但挑战在于保持它作为 x64 运行。

最佳答案

回答我自己的问题。

当您从您自己的 COM 服务器返回一个 IStream 时,.NET 互操作 DLL 将一个 IStream 放入它的接口(interface)中。例如,假设类型库是 MyComServer,那么互操作将包含一个类 MyComServer.Interop.IStream。

此 IStream 类具有 RemoteRead、RemoteWrite 等函数。这些函数将引用字节作为第一个参数。使用这些在 32 位到 32 位上工作得很好,但是那个 ref 可能变成一个指针,所以在 64 到 32 上出了点问题。

解决方案是使用“as”(或可能只是转换)将 MyComServer.Interop.IStream 转换为 System.Runtime.InteropServices.ComTypes.IStream。然后,这需要一个更熟悉的 byte[]、int count 和 IntPtr 作为返回大小。

IntPtr 很烦人,因为它可能是一个 out int,但我使用了(手动输入,所以没有检查编译器..)

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

关于c# - 从进程外 C++ COM 获取字节数组到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1730032/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com