diff --git a/src/Generator/Generators/CSharp/CSharpMarshal.cs b/src/Generator/Generators/CSharp/CSharpMarshal.cs index d25db12c..0ae0086d 100644 --- a/src/Generator/Generators/CSharp/CSharpMarshal.cs +++ b/src/Generator/Generators/CSharp/CSharpMarshal.cs @@ -557,8 +557,7 @@ namespace CppSharp.Generators.CSharp if (Context.Context.Options.MarshalCharAsManagedChar && primitive == PrimitiveType.Char) { - Context.Return.Write($"({typePrinter.PrintNative(pointer)}) "); - Context.Return.Write(param.Name); + Context.Return.Write($"({typePrinter.PrintNative(pointer)}) &{param.Name}"); return true; } diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index e3137c5f..0e7fc348 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -94,7 +94,6 @@ public unsafe class CSharpTests : GeneratorTestFixture { } - CSharp.CSharp.ReturnCharPointer(); int value = 5; IntPtr intPtr = CSharp.CSharp.RValueReferenceToPointer((void**) &value); Assert.That((int) intPtr, Is.EqualTo(value)); @@ -103,6 +102,14 @@ public unsafe class CSharpTests : GeneratorTestFixture #pragma warning restore 0219 } + [Test] + public void TestReturnCharPointer() + { + Assert.That(new IntPtr(CSharp.CSharp.ReturnCharPointer()), Is.EqualTo(IntPtr.Zero)); + const char z = 'z'; + Assert.That(*CSharp.CSharp.TakeConstCharRef(z), Is.EqualTo(z)); + } + [Test] public void TestIndexer() { diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index d487bd1c..d5a4fcb6 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -1566,6 +1566,11 @@ char* returnCharPointer() return 0; } +char* takeConstCharRef(const char& c) +{ + return const_cast(&c); +} + const char*& takeConstCharStarRef(const char*& c) { return c; diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index 4e73f2fb..21efb7ba 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -1312,6 +1312,7 @@ public: DLL_API void va_listFunction(va_list v); DLL_API char* returnCharPointer(); +DLL_API char* takeConstCharRef(const char& c); DLL_API const char*& takeConstCharStarRef(const char*& c); DLL_API const void*& rValueReferenceToPointer(void*&& v);