diff --git a/Silk.NET.sln b/Silk.NET.sln
index 5b6a25d208..14f6557734 100644
--- a/Silk.NET.sln
+++ b/Silk.NET.sln
@@ -618,6 +618,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Assimp.Tests", "src\Assimp\Silk.NET.Assimp.Tests\Silk.NET.Assimp.Tests.csproj", "{12D0A556-7DDF-4902-8911-1DA3F6331149}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Core.Tests", "src\Core\Silk.NET.Core.Tests\Silk.NET.Core.Tests.csproj", "{4D871493-0B88-477A-99A1-3E05561CFAD9}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -3771,6 +3773,18 @@ Global
{12D0A556-7DDF-4902-8911-1DA3F6331149}.Release|x64.Build.0 = Release|Any CPU
{12D0A556-7DDF-4902-8911-1DA3F6331149}.Release|x86.ActiveCfg = Release|Any CPU
{12D0A556-7DDF-4902-8911-1DA3F6331149}.Release|x86.Build.0 = Release|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Debug|x64.Build.0 = Debug|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Debug|x86.Build.0 = Debug|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Release|x64.ActiveCfg = Release|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Release|x64.Build.0 = Release|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Release|x86.ActiveCfg = Release|Any CPU
+ {4D871493-0B88-477A-99A1-3E05561CFAD9}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -4072,6 +4086,7 @@ Global
{25ABCA5E-4FF6-43ED-9A5E-443E1373EC5C} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0}
{01B6FFA0-5B37-44EA-ABDF-7BABD05874C5} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0}
{12D0A556-7DDF-4902-8911-1DA3F6331149} = {6EADA376-E83F-40B7-9539-71DD17AEF7A4}
+ {4D871493-0B88-477A-99A1-3E05561CFAD9} = {0651C5EF-50AA-4598-8D9C-8F210ADD8490}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F5273D7F-3334-48DF-94E3-41AE6816CD4D}
diff --git a/src/Core/Silk.NET.Core.Tests/Silk.NET.Core.Tests.csproj b/src/Core/Silk.NET.Core.Tests/Silk.NET.Core.Tests.csproj
new file mode 100644
index 0000000000..4b6279f4c3
--- /dev/null
+++ b/src/Core/Silk.NET.Core.Tests/Silk.NET.Core.Tests.csproj
@@ -0,0 +1,30 @@
+
+
+
+ net6.0
+ true
+ preview
+ enable
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
diff --git a/src/Core/Silk.NET.Core.Tests/TestSilkMarshal.cs b/src/Core/Silk.NET.Core.Tests/TestSilkMarshal.cs
new file mode 100644
index 0000000000..e2d58d8977
--- /dev/null
+++ b/src/Core/Silk.NET.Core.Tests/TestSilkMarshal.cs
@@ -0,0 +1,51 @@
+using System.Collections.Generic;
+using Silk.NET.Core.Native;
+using Xunit;
+
+namespace Silk.NET.Core.Tests;
+
+public class TestSilkMarshal
+{
+ private readonly List encodings = new()
+ {
+ NativeStringEncoding.BStr,
+ NativeStringEncoding.LPStr,
+ NativeStringEncoding.LPTStr,
+ NativeStringEncoding.LPUTF8Str,
+ NativeStringEncoding.LPWStr,
+ };
+
+ [Fact]
+ public void TestEncodingString()
+ {
+ var input = "Hello world";
+ foreach (var encoding in encodings)
+ {
+ var pointer = SilkMarshal.StringToPtr(input, encoding);
+ var roundTrip = SilkMarshal.PtrToString(pointer, encoding);
+ Assert.Equal(input, roundTrip);
+ }
+ }
+
+ [Fact]
+ public void TestEncodingStringArray()
+ {
+ var inputs = new List()
+ {
+ "Hello world",
+ "Foo",
+ "Bar",
+ "123",
+ };
+
+ foreach (var encoding in encodings)
+ {
+ var pointer = SilkMarshal.StringArrayToPtr(inputs, encoding);
+ var roundTrip = SilkMarshal.PtrToStringArray(pointer, inputs.Count, encoding);
+ for (var i = 0; i < roundTrip.Length; i++)
+ {
+ Assert.Equal(inputs[i], roundTrip[i]);
+ }
+ }
+ }
+}
diff --git a/src/Core/Silk.NET.Core/Native/SilkMarshal.cs b/src/Core/Silk.NET.Core/Native/SilkMarshal.cs
index e55da9e2e5..9bebfc1d5e 100644
--- a/src/Core/Silk.NET.Core/Native/SilkMarshal.cs
+++ b/src/Core/Silk.NET.Core/Native/SilkMarshal.cs
@@ -456,7 +456,7 @@ public static unsafe string[] PtrToStringArray
var ptrs = (nint*) input;
for (var i = 0; i < numStrings; i++)
{
- ret[i] = PtrToString(ptrs![i]);
+ ret[i] = PtrToString(ptrs![i], encoding);
}
return ret;