C # AnsiString to String - PullRequest
       3

C # AnsiString to String

0 голосов
/ 03 июня 2011

У меня есть внешняя DLL, которая возвращает AnsiString.

Я настроил свой код следующим образом:

        [DllImport("CDCrypt.dll", CharSet = CharSet.Ansi)]
        public static extern string Decrypt(string s);

        public string myDllMessage()
        {
            return DllMessage("Û(ÉÄ´-zÕ< tÆ");
        }

Является ли приведение из AnsiString в String нормально с внешней ссылкой на dll?

Ответы [ 2 ]

1 голос
/ 03 июня 2011

Функции, которые возвращают строки, являются проблемой управления памятью. Кто-то должен освободить память для строки. Маршаллер pinvoke попытается позаботиться об этом, он использует CoTaskMemFree ().

На практике это вряд ли сработает, нативный код редко использует CoTaskMemAlloc () для выделения памяти строки. В XP это приводит к необратимой утечке памяти, в Vista и Win7 это приведет к сбою вашей программы. У них гораздо более строгий менеджер кучи.

Единственное, что вы можете сделать, это объявить тип возвращаемого значения как IntPtr. Затем выполните маршалирование возвращаемого значения самостоятельно с помощью функции Marshal.PtrToStringAnsi (). Это, безусловно, сработает, вероятность того, что вы получите правильное значение, довольно мала. Строка будет преобразована из Unicode в Ansi, это преобразование с потерями. Тогда вы должны освободить память. Ты не можешь Вы не можете вызвать эту функцию.

1 голос
/ 03 июня 2011

Вы можете указать кодировку:

[DllImport("CDCrypt.dll", CharSet = CharSet.Ansi)]
public static extern string DllMessage();

Также будьте осторожны с такими сигнатурами методов, которые возвращают строки, так как вы можете получить утечки памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...