Можно ли получить a char*
для переменной string
в С#?
Мне нужно преобразовать строку пути в char*
для использования некоторой собственной функции win32...
Можно ли получить a char*
для переменной string
в С#?
Мне нужно преобразовать строку пути в char*
для использования некоторой собственной функции win32...
Вы можете передать StringBuilder
как char*
.
Посмотрите http://pinvoke.net, чтобы увидеть, нет ли сигнатуры для этой функции.
Хорошо, вы могли бы это сделать:
string str = "my string";
unsafe
{
fixed (char* p = str)
{
// do some work
}
}
где есть оператор (char *), связанный со строковым объектом. Однако выходной формат может быть несовместим с базовым C или другим форматом... это, однако, довольно хорошее решение для синтаксического анализа строки. Надеюсь, что это поможет любому, кто читает этот пост.
Это зависит от того, что вы хотите сделать. Когда вы вызываете функцию Win32 через PInvoke, вы должны просто передать переменную String; каркасные маршалы все для вас. Если вам нужно что-то более сложное, посмотрите Marshal.StringToHGlobalAnsi и другие методы класса Marshal
.
Чтобы объединить 2 анвера, уже заданного, это зависит от того, какое направление вам необходимо для вашего параметра.
Если функции просто нужна строка ввода, то есть const char *
, вы можете использовать аргумент типа System.String
(или plain string
).
Если функция заполняет строку, т.е. char * buffer, int bufferSize
, вы можете передать System.Text.StringBuilder
.
В обоих случаях (auto-) Marshaling выполнит необходимые преобразования для вас.
Не требуется небезопасный контекст для следующего фрагмента кода (и да, он показывает, что внутренние болты и биты о реализации метода string
GetHashCode
показывают его разницу с одним в Java, потому что в С# значение hashcode isn 't кэшируется, и в целом это показывает, что строки С# не являются в конечном счете неизменными, как вы могли бы научить, не можете иметь дело с Фон Нейманом):
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();
}
}
}
}
Вы можете получить массив byte [] из строки, используя Encoding.ASCII.GetBytes. Вероятно, это конвертируется в char *, используя фиксированный оператор в С#. (Это связывает выделенную память, не позволяя gc ее перемещать, - тогда вы можете сделать указатель на нее).
Итак, мой ответ да, только если вам удастся преобразовать байт * в char *. (в C/С++ это не будет проблемой, но я не уверен в С#)
PS > Я отправлю код позже, если найду закладку в статье об этом. Я знаю, что у меня это где-то..