How to pass a ref string from C# to a DLL
C#
[DllImport("SampleDLL.Dll", CharSet = CharSet.None)]
[return: MarshalAs(UnmanagedType.BStr)]
extern public static string StringTest(
[MarshalAs(UnmanagedType.BStr)] ref string refString
);
static void Main() {
string refString = new string('0', 16);
string retString = StringTest(ref refString);
Console.WriteLine($"{nameof(refString)} length={refString.Length}, value={refString}");
Console.WriteLine($"{nameof(retString)} length={retString.Length}, value={retString}");
Console.ReadKey();
}
C++
BSTR WINAPI StringTest(
BSTR* refString
) {
if (*refString != nullptr) {
OutputDebugStringW((LPCWSTR)refString);
SysFreeString(*refString);
}
wchar_t str1[] = L"refString";
wchar_t str3[] = L"retString";
*refString = SysAllocStringLen(str1, lstrlenW(str1));
return SysAllocStringLen(str3, lstrlenW(str3));
}