-1

我正在使用互操作调用 C++ COM 组件,并且编组需要将参数之一作为ref Byte传入。参数实际上是一个字符串。如何将字符串(或 char 数组)转换为 Byte 以传递给此方法?

方法 IDL

 [helpstring("method Read")]
    HRESULT _stdcall Read(
                    [in] unsigned char* path, 
                    [in] unsigned char command, 
                    [in] unsigned char nShortAddr, 
                    [out] short* pnDataSize, 
                    [out] unsigned char** ppbyData, 
                    [out] unsigned long* pnError);

伊利诺伊州

.method public hidebysig newslot virtual 
        instance void  Read([in] uint8& path,
                            [in] uint8 command,
                            [in] uint8 nShortAddr,
                            [out] int16& pnDataSize,
                            [out] native int ppbyData,
                            [out] uint32& pnError) runtime managed internalcall

在 Visual Studio 中看到的包装器中的方法

    public virtual void Read(ref byte path, byte command, byte nShortAddr,  
out short pnDataSize, System.IntPtr ppbyData, out uint pnError)
4

2 回答 2

2

这只是一个编写不佳的 COM 接口。它只能在 C++ 代码的进程内使用时工作。这可能是创作者的全部意图。像这样的参数类型声明unsigned char*是模棱两可的,它可能意味着一个字节是通过引用传递的,但也可能表示一个字节数组。您可以使用 IDL 中的属性来区分这两者,但它们没有被使用。因此,类型库导入器只能假设这是一个ref byte.

如果源 IDL 无法更新,则只有一个不错的解决方法,您必须编辑互操作库。为此,首先使用 ildasm.exe 反编译现有的。然后编辑参数类型,最好通过创建一个与示例具有相同声明的虚拟 C# 接口来完成。将 humpty-dumpty 与 ilasm.exe 重新组合在一起

于 2013-04-05T19:54:33.167 回答
-1

您无法转换StringByte

但是使用 ASCII 编码可以转换StringByte[]


String is .Net is - 字符串是用于表示文本的 Unicode 字符的顺序集合。String 对象是表示字符串的对象的顺序集合System.Char

你可以得到字符串作为Byte[]使用System.Text.Encoding.ASCII.GetBytes(my_string)

byte[] bytes = System.Text.Encoding.ASCII.GetBytes(my_string)
于 2013-04-05T02:20:23.703 回答