我在文件 IPlan.idl 中定义了一个 COM 接口,它为 unsigned char* 缓冲区定义了一个属性。
[
object,
uuid(...),
dual,
helpstring("..."),
pointer_default(unique)
]
interface IPlan : IDispatch
{
...
[id(28), helpstring("method SetByte")
HRESULT SetByte([in] long index, [in] unsigned char buffer);
[id(29), helpstring("method GetByte")
HRESULT GetByte([in] long index, [out, retval] unsigned char * pBuffer);
[id(30), propget, helpstring("property Buffer")]
HRESULT Buffer([out, retval] unsigned char** pBuffer);
[id(30), propput, helpstring("property Buffer")]
HRESULT Buffer([in] unsigned char* newBuffer);
...
}
我的实现类 MyPlan 是用 C# 定义的。此类与 C++ COM 类 CProcessor 对话。CProcessor 将一些数据计算到一个 unsigned char* 缓冲区中。一旦 CProcessor 中的所有数据都存储在其缓冲区中,此数据就会加载到 MyPlan 对象中。
IPlan 的元数据定义了以下函数签名:
public interface IPlan
{
...
byte GetByte(int index);
void SetByte(int index, byte buffer);
IntPtr get_Buffer();
void set_Buffer(ref byte pBuffer);
...
}
我可以使用 CProcessor 中的 GetByte 和 SetByte 来访问和修改 MyPlan 中的 byte[] 变量。我还可以通过编组 byte[] 变量来使用 get_Buffer() 。
我的问题是如何利用
set_Buffer(ref byte pBuffer)
功能?当我在 CProcessor 中调用它时,pBuffer 只包含缓冲区的第一个字节(如对 SetByte(0, data) 的调用)。我假设我需要像在 getter 中那样编组 setter,但我的搜索结果是空的。我试过了
set_Buffer([MarshalAs(UnmanagedType.LPStr)] ref byte pBuffer);
但这似乎对传递整个数组没有任何作用。