2016-04-21 7 views
-2

У меня есть обертка неуправляемого метода:C# Мусорные данные в строке из неуправляемого метода

[DllImport(DLL_LOCATION, CharSet = CharSet.Auto)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern Boolean voGetFirmwareVersion(StringBuilder s, ref uint d); 

Это работает отлично, StringBuilder заполняются с китайскими иероглифами. Fortuantely Я знаю, что текст следует читать:

"Камера 0057, FPGA 0009"

Что я получаю:

慃 敭 慲 〠 㔰 㬷 䘠 䝐 ⁁〰 㤰 猀 ""譗 珉 譞 珉 쬂 ☐"" 造 琞 \ u085cʩ "

Я попытался изменить CharSet ко всем комбинациям в своем флажке DLLImport и попытался изменить кодировку возвращаемых строк безрезультатно. Помогите мне в интернете!

EDIT: DLL, к которому я звоню, принадлежит устройству, которое я сейчас программирую. Все остальные функции работают, но упомянутый выше даст мне только китайские символы.

EDIT СНОВА: Ниже приведен код, я использую для вызова метода подписи выше:

private string getFirmware() 
    {    
     uint r = 31; 
     StringBuilder sb = new StringBuilder(31); 
     bool result = voGetFirmwareVersion(sb, ref r); 

     if(!result) 
     { 
      MessageBox.Show("Error Getting Firmware"); 
     }  

     return sb.ToString();   
    } 
+0

, с которой вы пытаетесь позвонить? –

+0

вопрос, отредактированный с помощью DLL-информации –

+0

, пожалуйста, предоставьте обновленный код [mcve] –

ответ

0

Оказывается, ответ был установить НабораСимволы Нет. Не имея его там, в первую очередь, по умолчанию используется Unicode. Я предположил, что это не было бы.

+1

Не использовать Авто. Используйте Ansi. Прочтите документы. –

+0

Спасибо за головы Дэвида, в предыдущих сообщениях мне посоветовали не использовать Ansi. Это все работает. –