2016-12-13 5 views
0

C++ 프로젝트에 플러그인을 작성하고 관리되는 .NET 코드에서 C 함수의 노출을 허용하는 UnmanagedExports Nuget 패키지를 활용하고 있습니다. 내가 (C에서의 char * ++로 정의) 캐릭터 아래는이 작업을 위해 내가 정의한 UnmanagedExport의 방법을받는 플러그인을 작성했습니다 https://www.nuget.org/packages/UnmanagedExportsStringBuilder를 사용하여 pinvoke char * []을 반전합니다.

.

[DllExport("GetString", CallingConvention = CallingConvention.Cdecl)] 
public static void GetString(StringBuilder MyString) 
{    
    //Use and modify the StringBuilder. It receives the string passed and returns the modified version because it is being passed by reference. 
} 

위의 코드는 아름답게 실행됩니다.

이제 UnmanagedExport 코드에 문자열 배열을 전달할 수 있습니까? C++은 호출에 char * []가 필요하다고 정의합니다.

이것은 작동하지 않습니다.

[DllExport("GetString", CallingConvention = CallingConvention.Cdecl)] 
public static void GetString(StringBuilder[] MyString) 
{    
} 
+1

골든 규칙은 먼저 동일한 인수를 사용하여 printf()로 값을 표시하는 C 함수를 작성하는 것입니다. 당신은 그 문제를 완전히 발견 할 수 있습니다 : * 배열의 길이는 얼마입니까? * 모르겠지만, C#은 몰랐습니다. Giesecke는 알지 못합니다. 관리되지 않는 코드를 아직 충분히 이해하지 못하면 해당 단계를 건너 뛰지 마십시오. –

+0

@HansPassant 올바른 방향으로 나를 가리키는 입력을 주셔서 감사합니다. 필자는 아래에 내 대답을 추가했지만 이것은 문자열 배열로 전달할 수있게 해줍니다. 배열에 대한 변경 사항은 호출자 코드가 수정 된 경우 호출자 코드에 반영되지 않습니다. – CathalMF

답변

0

이렇게하면 문자열 []이 전달되지만 한 방향으로 만 전달됩니다.

[DllExport("GetStrings", CallingConvention = CallingConvention.Cdecl)] 
public static void GetStrings([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]string[] MyStrings, int size) 
{ 
    foreach(var s in MyStrings) 
    { 
     MessageBox.Show(s); 
    } 
} 
관련 문제