将C#字符串转换为字节以实现COM互操作

将C#字符串转换为字节以实现COM互操作,c#,com-interop,C#,Com Interop,我使用互操作调用C++ COM组件,编组需要一个参数作为 REF字节传递。该参数实际上是一个字符串。如何将字符串(或字符数组)转换为字节以传递给此方法 方法IDL [helpstring("method Read")] HRESULT _stdcall Read( [in] unsigned char* path, [in] unsigned char command,

我使用互操作调用C++ COM组件,编组需要一个参数作为<强> REF字节传递。该参数实际上是一个字符串。如何将字符串(或字符数组)转换为字节以传递给此方法

方法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);
IL

.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)
无法将
字符串
转换为
字节
但是,可以使用ASCII编码将
字符串
转换为
字节[]


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

您可以使用
System.Text.Encoding.ASCII.GetBytes(my_String)
Byte[]的形式获取字符串


这只是一个编写糟糕的COM接口。它只能在C++代码中使用时才能工作。这可能是造物主的全部意图。像
unsigned char*
这样的参数类型声明是不明确的,它可能意味着通过引用传递单个字节,但也可能表示字节数组。您可以在IDL中使用属性来区分这两个属性,但没有使用它们。因此,类型库导入程序只能假定这是一个
ref字节


如果无法更新源IDL,只有一个合适的修复方法,您必须编辑互操作库。首先使用ildasm.exe反编译现有文件。然后编辑参数类型,最好使用与示例相同的声明创建一个伪C#接口。将humpty dumpty与ilasm.exe放回一起

它真的是单个字节,而不是
字节[]
字节*
?你真的不能将整个字符串转换成单个字节……看看@JasonWatkins:我也这么想,但这就是互操作编组给我的!我不知道该怎么跟你说。这是不可能的。-1到目前为止:你理解这个问题,因为它是没有意义的,所以张贴可能是值得怀疑的价值。如果您为COM对象发布IDL,可能会比人们试图解释为什么您得到如此奇怪的封送处理要好得多。谢谢Hans。不幸的是,该组件来自第三方,我无法控制它。我只需要tlb,然后根据它生成idl。你能帮我把IL数据类型改成什么吗?
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(my_string)