回答
您可以通过StringBuilder
作为char*
。
查看http://pinvoke.net以查看函数的签名是否已经存在。
你可以得到的byte []使用字符串数组Encoding.ASCII.GetBytes。 这可能转换为char *在C#中使用固定语句。 (这引脚分配的内存,不允许gc移动它 - 然后你可以做一个指针)。
所以我的回答是,只有当你设法将byte *转换为char *。 (在C/C++中这不会是一个问题,但我不确定C#)
PS>如果我在此找到一篇文章的书签,我会稍后发布一些代码。我知道我有它..
这取决于你想要做什么。当您通过PInvoke调用Win32函数时,您应该只能传递字符串变量;该框架为您整理所有内容。如果您需要更复杂的东西,请参阅Marshal.StringToHGlobalAnsi和Marshal
类的其他方法。
要结合已经给出的2个肛门,它取决于你的参数需要的方向。
如果函数只需要输入字符串,即const char *
,则可以使用类型为System.String
(或普通的string
)的参数。
如果函数填充字符串,即char * buffer, int bufferSize
,则可以传递System.Text.StringBuilder
。
在这两种情况下,(自动)封送会为您做必要的转换。
那么你当然可以这样做:
string str = "my string";
unsafe
{
fixed (char* p = str)
{
// do some work
}
}
那里有一个运营商(的char *)绑定到字符串对象。 但是,输出格式可能与底层C或其他格式不兼容......然而,这是解析字符串的很好的解决方案。 希望对阅读本文的读者有所帮助。
这给出了一个指向'System.Char'元素的指针,它对应于Win32的'WCHAR *',但问题是要求'char *'。 – 2018-03-09 20:59:34
没有不安全的上下文是必需的下面的代码段(和是它显示有关string
执行内部螺栓和比特的GetHashCode
方法示出了它与一个在Java中的差异,因为在C#哈希码ISN'的值牛逼缓存,通常它表明,C#字符串不是一成不变的,最终你可能被教导一样,不能与丰尼曼处理):
using System;
using System.Runtime.InteropServices;
namespace Guess
{
class Program
{
static void Main(string[] args)
{
const string str = "ABC";
Console.WriteLine(str);
Console.WriteLine(str.GetHashCode());
var handle = GCHandle.Alloc(str, GCHandleType.Pinned);
try
{
Marshal.WriteInt16(handle.AddrOfPinnedObject(), 4, 'Z');
Console.WriteLine(str);
Console.WriteLine(str.GetHashCode());
}
finally
{
handle.Free();
}
}
}
}
这是不正确的,请参阅http://stackoverflow.com/a/10980174/3427520 – zwcloud 2017-04-06 04:54:12
@zwcloud **它完全错误的事情陈述,答案是正确的,最有效的和最不固定的上下文(与不安全的上下文)* *。答案完全是要求做的。通过'GCHandle.alloc'锁定字符串的指针不会造成任何内存泄漏,除非您稍后在基础上下文中强制使用指针。 C#中的整个指针/内存概念被认为是低级/高级主题,如果你使用指针,这意味着你理解整个概念并基本知道你在做什么。 – Lu4 2017-04-10 22:04:28
关于引用的问题和答案,这个问题是完全有效的,但与上述问题无关,没有提到任何人都会存储指针。如果你以后用C#创建的字符串,显然你需要将它复制到C中,因为它会涉及C中的那个字符串的分配,这将允许C稍后释放它。所以它通常意味着你不能将你的指针固定在生活中,既不是在C#中编制(创建)你的字符串的副本并将它存储在C中也是好的,因为C将不能在稍后解除分配它。 – Lu4 2017-04-10 22:11:46
- 1. c char字符指针
- 2. 指针 - 字符串C++
- 3. C字符串和指针
- 4. c字符串指针
- 5. c字符串指针
- 6. 带指针的反向char字符串
- 7. C,指针,字符串
- 8. C字符串和指针
- 9. JSCType中的C++ char指针-LPSTR缓冲区的Javascript字符串
- 10. c char字符**,字符串数组空指针
- 11. C++中的简单字符串指针
- 12. 指向字符串C的指针
- 13. 理解C中字符串的指针
- 14. 玩指针,昏迷和char *字符串
- 15. C++中的字符串和指针
- 16. 使C++中的字符串指针和数组的指针
- 17. 指向字符串的指针 - C
- 18. C找到字符串中的子字符串与指针
- 19. C指针,指针,字符
- 20. C++,SQLite - 指向字符串的指针的指针
- 21. scanf字符指针中的字符串
- 22. 字符串指针的数组 - C
- 23. C++中的字符指针
- 24. C指针,指向和字符串
- 25. Ç指定字符串指针到其他字符串指针
- 26. 如何在C++中使用字符串和字符串指针
- 27. 解析C字符串和多个指针C字符串
- 28. 字符串指针
- 29. 使用C中的字符指针的字符串
- 30. 字符串上的指针C数组
+1,或者只是'string',如果它只是一个输入参数。 – user7116 2009-11-01 21:50:46
我授予这个答案,因为你基本上回答了我的问题,但似乎至少为我所做的一切需要的是固定的(char * s = string){...} – Kris 2009-11-02 10:08:05
我试着用SecureString(char *,int length)以及SecureString(sb,sb.Length)或SecureString((char *)sb,sb.Length)都不起作用。说不能将System.Text.StringBuilder转换为char *。 – Despertar 2012-06-08 02:24:53