回答
您可以通過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