【发布时间】:2014-07-18 15:13:34
【问题描述】:
我有一些非托管 C++ 动态库和 C# GUI 应用程序,正在使用它。我需要将已知大小的字符串数组传递给填充它的 C++ 库。还有最大字符串长度值。我正在尝试传递 StringBuilder 的数组,它本身具有合适的大小和合适的内部元素容量(又名缓冲区数组)。
// 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
我在库 API 调用中遇到了 System.AccessViolationException 异常。出现此类问题的原因可能是什么?
【问题讨论】:
标签: c# c++ marshalling