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