Skip to content

Instantly share code, notes, and snippets.

@KOZ60
Last active September 25, 2023 07:47
Show Gist options
  • Save KOZ60/cea507b7d53d19be07333a0fb077b387 to your computer and use it in GitHub Desktop.
Save KOZ60/cea507b7d53d19be07333a0fb077b387 to your computer and use it in GitHub Desktop.
ref string

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));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment