2012-04-06 3 views
1

내 코드 여기에 무슨 문제가 있는지 확인할 수 없습니다. 이것은 내 관리되지 않는 C++ 코드에서 배열 fontNames를 만드는 데 사용되며,이 코드는 C#에서 검색됩니다. C# 코드는 단순히 빈 문자열 배열을 출력합니다. (이것은 동일한 접근법을 사용하는 다른 int 배열에 대해서는 문제가되지 않습니다.)관리되지 않는 char * 배열 관리되는 System :: String 관리되는 C++

exportFontNames에서 출력되는 fontnames 배열은 C++에서 잘 작동합니다 (잘 인쇄 됨).

unsigned int fontNamesCount = 0; 
const char ** unmanagedFontNames = o.exportFontNames(fontNamesCount); 
array<String^>^ fontNames = gcnew array<String^>(fontNamesCount); 
for (unsigned int i = 0; i < fontNamesCount; i++) 
{ 
    fontNames[i] = gcnew String(unmanagedFontNames[i]); 
    delete [] unmanagedFontNames[i]; 
} 
delete [] unmanagedFontNames; 

결과 문자열 배열에 아무런 이유가없는 이유는 누구나 볼 수 있습니까? 내 이해에서 gcnew String 생성자는 관리되지 않는 char 배열의 복사본을 만들어야하므로 삭제가 영향을 미치지 않아야하며 삭제를 제거하면 아무런 차이가 없습니다. 나는 혼란 스럽다. 대신 루프에서이 일을

+0

나는 오래 전에 비슷한 문제 했어. AFAIR 관리되는/관리되지 않는 경계를 넘을 때 데이터를 마샬링해야합니다. http://msdn.microsoft.com/en-us/library/bb384865.aspx 및 http://msdn.microsoft.com/en-us/library/bb384859.aspx를 참조하십시오. – Bazurbat

+1

디버거를 사용하십시오. – Abyx

+0

Bazurbat, 제안 주셔서 감사합니다, 나는 그것을 시도했지만 아무것도 바뀌지 않았다. – penguinvasion

답변

0

시도 :

fontNames[i] = marshal_as<String^>(unmanagedFontNames[i]); 

당신도 몇 가지 지침이 필요합니다은 :

#include <msclr/marshal.h> 
using namespace msclr::interop; 
관련 문제