Как передать строковую переменную C # параметру sbyte *? - PullRequest
0 голосов
/ 06 июля 2018

Я унаследовал C ++ DLL с соответствующим заголовочным файлом с функциями, объявленными как

int func1(int i);
int func2(char* s);

Я также унаследовал эталонный класс VC ++, который оборачивает указанную выше DLL для использования в среде C #

public ref class MyWrapperClass
{
    int func1_w(int i)
    {
        return func1(i);
    }
    int func2_w(char* s)
    {
        return func2(s);
    }
}

Из моего приложения на C # я могу использовать func1_w (int i), но я не понимаю, как передать строку в func2_w (sbyte * s): я получил ошибку о том, что не могу получить указатель на SByte. Я установил проект C # как небезопасный и объявил функцию небезопасной.

Как передать параметр sbyte * в functiuon func2_w?

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

В итоге я использовал следующий подход:

sbyte[] buffer = new sbyte[256];
String errorMessage;
fixed (sbyte* pbuffer = &buffer[0])
{
    megsv86bt_nips.getLastErrorText(pbuffer);
    errorMessage = new string(pbuffer);
};

Кто-то опубликовал это в комментариях к моему вопросу, но я больше не вижу его.

0 голосов
/ 06 июля 2018

Как я уже сказал в комментарии, возможно, самая глупая обертка, которую я когда-либо видел. Вы должны будете выделить строку ANSI вручную. Два способа:

string str = "Hello world";

IntPtr ptr = IntPtr.Zero;

try
{
    ptr = Marshal.StringToHGlobalAnsi(str);

    // Pass the string, like:
    mwc.func2_w((sbyte*)ptr);
}
finally
{
    Marshal.FreeHGlobal(ptr);
}

Другой способ, используя Encoding.Default (но обратите внимание на специальную обработку для завершения \0)

string str = "Hello world";

// Space for terminating \0
byte[] bytes = new byte[Encoding.Default.GetByteCount(str) + 1];
Encoding.Default.GetBytes(str, 0, str.Length, bytes, 0);

fixed (byte* b = bytes)
{
    sbyte* b2 = (sbyte*)b;
    // Pass the string, like:
    mwc.func2_w(b2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...