是否可以在C#中为char*
变量获取string
?
我需要将路径字符串转换为char*
以使用一些本机win32函数...
答案 0 :(得分:42)
嗯,你当然可以这样做:
string str = "my string";
unsafe
{
fixed (char* p = str)
{
// do some work
}
}
其中有一个运算符(char *)绑定到字符串对象。 但是,输出格式可能与底层C或其他格式不兼容......但这是解析字符串的一个很好的解决方案。 希望对阅读这篇文章的人有所帮助。
答案 1 :(得分:12)
您可以将StringBuilder
作为char*
传递。
查看http://pinvoke.net以查看该功能的签名是否已经存在。
答案 2 :(得分:4)
这取决于你想做什么。当你通过PInvoke调用Win32函数时,你应该能够只传递String变量;框架为你整理了一切。如果您需要更复杂的内容,请查看Marshal.StringToHGlobalAnsi以及Marshal
类的其他方法。
答案 3 :(得分:4)
要合并已经给出的2个水壶,它取决于参数所需的方向。
如果函数只需要输入字符串,即const char *
,则可以使用类型System.String
(或普通string
)的参数。
如果函数填充字符串,即char * buffer, int bufferSize
,则可以传递System.Text.StringBuilder
。
在这两种情况下,(自动)Marshaling都会为您进行必要的转换。
答案 4 :(得分:4)
下面的代码不需要不安全的上下文(是的,它显示了string
的{{1}}方法实现的内部螺栓和位表明它与Java中的一个有区别,因为在C#哈希码的值没有被缓存,通常它表明C#字符串最终不会像你可能已经被教过一样,不能处理Fon Neiman):
GetHashCode
答案 5 :(得分:0)
您可以使用Encoding.ASCII.GetBytes从字符串中获取byte []数组。 这可能使用C#中的fixed语句转换为char *。 (这会占用分配的内存,不允许gc移动它 - 然后你可以指向它)。
所以,只有当你设法将byte *转换为char *时,我的答案才是肯定的。 (在C / C ++中,这不是问题,但我对C#不太确定)
PS>如果我找到关于此文章的书签,我会稍后发布一些代码。我知道我在某个地方......