Übergabe des beschreibbaren StringBuilder-Arrays von C # an C ++
Ich verwende eine nicht verwaltete dynamische C ++ - Bibliothek und eine C # -GUI-Anwendung. Ich muss ein Array von Zeichenfolgen mit bekannter Größe an die C ++ - Bibliothek übergeben, die es auffüllt. Es gibt auch einen maximalen Wert für die Zeichenfolgenlänge. Ich versuche, Array von übergebenStringBuilder
mit passender Größe selbst und passender Kapazität der internen Elemente (auch bekannt als Array von Puffern).
// C++ library part
#define MAX_STRING_LENGTH 200
const wchar_t* stringToPopulate = L"Hello, World";
MYDLL_API uint8_t __stdcall getSomeStrings(wchar_t** strings, uint64_t count) {
for(auto i =0; i < count; ++i){
// trivial string population
wcsncpy(*(providers + i), stringToPopulate,
min(wcslen(stringToPopulate), MAX_STRING_LENGTH ));
}
return 0;
}
// C# application part
[DllImport("myDllName.dll", CallingConvention = CallingConvention.StdCall)]
static extern Byte getSomeStrings(
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] StringBuilder[] strings,
UInt64 size
);
// calling
// create suitable string array
StringBuilder[] stringArrayToPass= new StringBuilder[desirableStringCount];
for(ulong i =0; i < desirableStringCount; ++i) {
stringArrayToPass[i] = new StringBuilder(maxStringLength);
}
res = getSomeStrings(stringArrayToPass, desirableStringCount); // exception
ich habeSystem.AccessViolationException
Ausnahme beim Aufruf der Bibliotheks-API. Was kann ein Grund für ein solches Problem sein?