2016-03-30 9 views
1

Я много googled & ничего не работает в моем случае. Вот мой код.Передача строки из C++ в C# не работает

.cpp

char* pp = "this_is_text"; 
DLL_EXPORT void ToString_Internal(MicroObject* a_microObj, char* a_str) 
{ 
    *a_str = *pp; 
} 

#define DLL_EXPORT __declspec(dllexport)

C# (импорт)

[DllImport("Serializer", CharSet = CharSet.Ansi)] 
private extern static void ToString_Internal(IntPtr a_ptr, StringBuilder a_builder); 

C# (использование)

StringBuilder l_builder = new StringBuilder(1000); //set 1000 len, for testing 
ToString_Internal (m_ptr, l_builder);  //invoke to DLL function 
Console.WriteLine (l_builder.ToString()); //print to console 

Questi на # 1: Console.WriteLine() печатает только первую букву («t») в терминале. Что это за проблема?

Вопрос №2: Я выделяю память в C# (используя StringBuilder). Является ли C# GC deallocating memory в моем случае или мне нужно освободить память вручную и с какой стороны (C или C#).

Если вам нужна дополнительная информация, сообщите мне.

+0

'* a_str = * рр;' - вы понимаете, что копии точно * один символ *, верно? – WhozCraig

+0

@DavidHeffernan Ах сладкий. Спасибо – MickyD

ответ

3

Console.WriteLine() принт только первая буква ("t") в терминале. Что это за проблема?

Вы только скопировали один символ здесь:

*a_str = *pp; 

Вместо этого вам нужно скопировать всю строку:

strcpy(a_str, pp); 

Конечно, вы просто просить перерасход ошибку буфера с этим код. Вы также должны передать длину буфера при вызове функции и организовать, чтобы вы не копировали за пределы этого буфера.

Я выделяю память на C# (используя StringBuilder). Является ли C# GC deallocating memory в моем случае или мне нужно освободить память вручную и с какой стороны (C или C#).

Память, передаваемая в код C++, управляется инфраструктурой p/invoke и гарантирует, что она будет распределена и освобождена правильно. Вам больше не нужно ничего делать.


Из кода вы представляете, кажется, что функция использует __cdecl соглашение о вызовах. Добавить CallingConvention = CallingConvention.Cdecl в атрибуте DllImport:

[DllImport("Serializer", CharSet = CharSet.Ansi, 
    CallingConvention = CallingConvention.Cdecl)] 
+0

Понял .. Thankx @David & others. – MicroEyes