Marshal StringBuilder在C ++ / CLI中为char *(用于IN / OUT)

时间:2011-07-26 11:39:29

标签: c# c++-cli char marshalling stringbuilder

我正在加载一个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 *并返回以保存本机函数的答案?

2 个答案:

答案 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层的头文件中。非常方便的接口工具。祝好运。 (我已经使用了这些片段。)