COM字符串(BSTR)和.NET字符串之间的区别是什么?

COM字符串(BSTR)和.NET字符串之间的区别是什么?,.net,string,com,rcw,.net,String,Com,Rcw,这仅仅是字节组合“编码”数据的方式吗 我很好奇,因为我想知道RCW是如何自动获取.NET字符串并将其转换为COM BSTR的。我猜它只是从.NET字符串转换成一个有效的COM BSTR 相关:我可以在.NET中使用字节类型构造自己的有效BSTR吗?这两种字符串类型根本不相关。必须进行转换才能将一种类型转换为另一种类型 BSTR有许多约定必须遵循,包括通过SysAllocString*分配、与SysFreeString解除分配、具有长度前缀和两个空字符的终止符 Net字符串是通过托管堆分配的托管

这仅仅是字节组合“编码”数据的方式吗

我很好奇,因为我想知道RCW是如何自动获取.NET字符串并将其转换为COM BSTR的。我猜它只是从.NET字符串转换成一个有效的COM BSTR


相关:我可以在.NET中使用字节类型构造自己的有效BSTR吗?

这两种字符串类型根本不相关。必须进行转换才能将一种类型转换为另一种类型

BSTR有许多约定必须遵循,包括通过SysAllocString*分配、与SysFreeString解除分配、具有长度前缀和两个空字符的终止符

Net字符串是通过托管堆分配的托管类型。它的生存期由CLR垃圾收集器管理

要构建自己的BSTR,最好使用Marshal.StringToBSTR:

如果这还不够好,您可以使用pinvoke SysAllocString:


谢谢joncham。非常有用。我想我只是想知道如果我检查了位和字节,会有什么不同。它们都存放在某个地方。它们都代表着某种东西。它们不只是代表同一事物的不同位和字节吗(一个字符串?)是的,所有数据都只是字节;-)。问题是谁分配/释放这些字节,以及在布置这些字节时使用的约定。例如,在分配BSTR时,实际上并没有检索到指向所分配内存开始的指针。指针在分配的空间中有4个字节,因为前四个字节存储字符串的长度。@Richard DesLonde:是的,它们都是字符数组。但是,实际上不能将任何字符串用作
System.string
,因为
System.string
的任何构造函数都会将字符数组复制到另一个内存位置。