我正在加载一个C ++ / CLI将dll包装到我的C#软件中,并且需要一些char *参数用于底层本机C ++ dll!
我发现我需要传递一个StringBuilder来保存答案而不会出现一些Access违规行为?!
C#
StringBuilder sB = new StringBuilder();
WrapperClass wC = new WrapperClass();
wC.Function(sB);
C ++ / CLI
void WrapperClass::Function(StringBuilder ^sB)
{
nativeObject->Function(charString); // need the marshaled sB
}
C ++
void NativeObject::Function(char *charString)
{
// do something and save answer to charString
}
如何使用StringBuilder并将其编组为char *并返回以保存本机函数的答案?
答案 0 :(得分:1)
我看到的问题有两个:首先,您将UNICODE对象映射到MBCS或ASCII对象,其次是StringBuilder也不会自动固定。我建议你这样做:
void WrapperClass::Function(StringBuilder^ sB)
{
// Pin a copy of the string
String^ strVal = sB->ToString();
pin_ptr<const wchar_t> psVal = PtrToStringChars(strVal);
// Translate the UNICODE string to MBCS
int wchLen = wcslen(psVal);
int pchLen = wchLen * 2 + 1;
char* pchVal = new char[pchLen];
int nclen = WideCharToMultiByte(
CP_ACP, // Source codepage (default)
WC_COMPOSITECHECK, // ch@rs with accents
strVal, // UNICODE string
wchLen, // Number of UNICODE ch@rs
pchVal, // ASCII string
pchLen, // Max number of ASCII ch@rs
0, // No default ch@rs
0 // No default flag
);
pchVal[nclen] = '\0';
// Pass the MBCS string to MBCS function
nativeObject->Function(pchVal); // need the marshaled sB
// Cleanup
delete[] pchVal;
}
答案 1 :(得分:0)
您可以在以下工具的帮助下直接传入c#字符串:(简单!)
您需要利用一些interop abiliteis将字符串复制到非托管堆内存中,然后返回c ++ native来使用。在c ++ / cli层中使用时,这两个助手应该可以解决这个问题。将字符串传递给std :: string&amp;到本机c ++层。完成本机c ++后,将其复制回托管内存。
foreach ($obj as $key=>$value) {
echo "$key => $obj[$key]\n";
}
将上述代码放在c ++ / cli层的头文件中。非常方便的接口工具。祝好运。 (我已经使用了这些片段。)