0

我在文件 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);

但这似乎对传递整个数组没有任何作用。

MarshalAs(UnmanagedType.LPStr) - 这如何将 utf-8 字符串转换为 char*

在c#中使用dll的问题

4

1 回答 1

1

我能够使用

[id(1), propget, helpstring("Buffer")]
HRESULT Buffer([out, retval] VARIANT* pBuffer);
[id(1), propput, helpstring("Buffer")]
HRESULT Buffer([in] VARIANT pBuffer);

将无符号字符数组从 C++ 传递到 C#。C# 只需要转换为 byte[]

this.buffer = (byte[])myPlan.Buffer;
于 2013-11-07T17:30:28.713 回答