diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 51e984f..da7e287 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -22,6 +22,7 @@ env:
configuration: Release
publish_release: ${{ github.event.inputs.publish_release }}
version_suffix: ${{ github.event.inputs.version_suffix }}
+ tester_framework: net8.0
jobs:
build:
@@ -40,8 +41,11 @@ jobs:
- name: Prepare .NET
uses: actions/setup-dotnet@v3
with:
- dotnet-version: '6.0.x'
-
+ dotnet-version: |
+ 6.0.x
+ 7.0.x
+ 8.0.x
+
- name: Build solution
run: dotnet build --nologo -c ${{ env.configuration }}
working-directory: './src'
@@ -59,14 +63,14 @@ jobs:
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get install libhidapi-hidraw0
- dotnet run -- --requireOsPlatform LINUX --require64bit
+ dotnet run --framework ${{ env.tester_framework }} -- --requireOsPlatform LINUX --require64bit
working-directory: './src/HidApi.Net.Tester'
- name: Test OSX 64 bit
if: matrix.os == 'macos-latest'
run: |
brew install hidapi
- dotnet run -- --requireOsPlatform OSX --require64bit
+ dotnet run --framework ${{ env.tester_framework }} -- --requireOsPlatform OSX --require64bit
working-directory: './src/HidApi.Net.Tester'
- name: Setup Windows 64 bit
@@ -80,7 +84,7 @@ jobs:
- name: Test Windows 64 bit
if: matrix.os == 'Windows-latest'
- run: dotnet run -- --requireOsPlatform WINDOWS --require64bit
+ run: dotnet run --framework ${{ env.tester_framework }} -- --requireOsPlatform WINDOWS --require64bit
shell: msys2 {0}
working-directory: './src/HidApi.Net.Tester'
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 3ec396f..82b7c34 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -1,8 +1,9 @@
- net6.0
+ net6.0;net7.0;net8.0
enable
enable
true
+ Recommended
\ No newline at end of file
diff --git a/src/HidApi.Net.Tester/HidApiVerifier.cs b/src/HidApi.Net.Tester/IHidApiVerifier.cs
similarity index 74%
rename from src/HidApi.Net.Tester/HidApiVerifier.cs
rename to src/HidApi.Net.Tester/IHidApiVerifier.cs
index aa54a1e..8592b05 100644
--- a/src/HidApi.Net.Tester/HidApiVerifier.cs
+++ b/src/HidApi.Net.Tester/IHidApiVerifier.cs
@@ -1,6 +1,6 @@
namespace HidApi.Net.Tester;
-public interface HidApiVerifier
+public interface IHidApiVerifier
{
bool VerifyCharPointer();
bool VerifyWCharPointer();
diff --git a/src/HidApi.Net.Tester/Tester.cs b/src/HidApi.Net.Tester/Tester.cs
index 96d4fa8..d340817 100644
--- a/src/HidApi.Net.Tester/Tester.cs
+++ b/src/HidApi.Net.Tester/Tester.cs
@@ -73,7 +73,7 @@ private static bool Check64BitOs(bool? require64Bit)
return false;
}
- private static HidApiVerifier GetVerifier()
+ private static IHidApiVerifier GetVerifier()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
return new Linux();
@@ -84,7 +84,7 @@ private static HidApiVerifier GetVerifier()
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
return new Osx();
- throw new Exception("No verifier available for os platform.");
+ throw new NotSupportedException("No verifier available for os platform.");
}
private static OSPlatform GetOsPlatform()
@@ -101,6 +101,6 @@ private static OSPlatform GetOsPlatform()
if (RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD))
return OSPlatform.FreeBSD;
- throw new Exception("Unknown OsPlatform");
+ throw new NotSupportedException("Unknown OsPlatform");
}
}
diff --git a/src/HidApi.Net.Tester/Verifier/Linux.cs b/src/HidApi.Net.Tester/Verifier/Linux.cs
index 72ec44c..33ac414 100644
--- a/src/HidApi.Net.Tester/Verifier/Linux.cs
+++ b/src/HidApi.Net.Tester/Verifier/Linux.cs
@@ -1,11 +1,11 @@
namespace HidApi.Net.Tester;
-public class Linux : HidApiVerifier
+public class Linux : IHidApiVerifier
{
public bool VerifyCharPointer()
{
var version = Hid.VersionString();
- if (version.Split('.').Length == 3 && version.StartsWith("0."))
+ if (version.Split('.').Length == 3 && version.StartsWith("0.", StringComparison.InvariantCulture))
return true;
Console.WriteLine("Error: Could not verify HIDAPI. String seems to have incorrect format.");
diff --git a/src/HidApi.Net.Tester/Verifier/Osx.cs b/src/HidApi.Net.Tester/Verifier/Osx.cs
index e31c27d..c98e549 100644
--- a/src/HidApi.Net.Tester/Verifier/Osx.cs
+++ b/src/HidApi.Net.Tester/Verifier/Osx.cs
@@ -1,11 +1,11 @@
namespace HidApi.Net.Tester;
-public class Osx : HidApiVerifier
+public class Osx : IHidApiVerifier
{
public bool VerifyCharPointer()
{
var version = Hid.VersionString();
- if (version.Split('.').Length == 3 && version.StartsWith("0."))
+ if (version.Split('.').Length == 3 && version.StartsWith("0.", StringComparison.InvariantCulture))
return true;
Console.WriteLine("Error: Could not verify HIDAPI. String seems to have incorrect format.");
diff --git a/src/HidApi.Net.Tester/Verifier/Windows.cs b/src/HidApi.Net.Tester/Verifier/Windows.cs
index 4f247f9..f74d7e3 100644
--- a/src/HidApi.Net.Tester/Verifier/Windows.cs
+++ b/src/HidApi.Net.Tester/Verifier/Windows.cs
@@ -1,11 +1,11 @@
namespace HidApi.Net.Tester;
-public class Windows : HidApiVerifier
+public class Windows : IHidApiVerifier
{
public bool VerifyCharPointer()
{
var version = Hid.VersionString();
- if (version.Split('.').Length == 3 && version.StartsWith("0."))
+ if (version.Split('.').Length == 3 && version.StartsWith("0.", StringComparison.InvariantCulture))
return true;
Console.WriteLine("Error: Could not verify HIDAPI. String seems to have incorrect format.");
diff --git a/src/HidApi.Net.Tests/StringTests.cs b/src/HidApi.Net.Tests/StringTests.cs
index 7bf096a..eb43c65 100644
--- a/src/HidApi.Net.Tests/StringTests.cs
+++ b/src/HidApi.Net.Tests/StringTests.cs
@@ -9,6 +9,7 @@ public class StringTests
[TestMethod]
public void TestUnicode()
{
+#pragma warning disable CA1861
var data = new byte[6];
data[0] = 0;
data[1] = 1;
@@ -25,11 +26,13 @@ public void TestUnicode()
str.Should().Be(new string(new[] { '\u0100', '\u0100' }));
}
}
+#pragma warning restore CA1861
}
[TestMethod]
public void TestUtf32()
{
+#pragma warning disable CA1861
var data = new byte[12];
data[0] = 0;
data[1] = 1;
@@ -52,6 +55,7 @@ public void TestUtf32()
str.Should().Be(new string(new[] { '\u0100', '\u0100' }));
}
}
+#pragma warning restore CA1861
}
diff --git a/src/HidApi.Net/Internal/NullTerminatedString.cs b/src/HidApi.Net/Internal/NullTerminatedString.cs
index 2b5dd50..374af2d 100644
--- a/src/HidApi.Net/Internal/NullTerminatedString.cs
+++ b/src/HidApi.Net/Internal/NullTerminatedString.cs
@@ -1,3 +1,5 @@
+using System.Text;
+
namespace HidApi;
internal readonly ref struct NullTerminatedString
@@ -11,9 +13,27 @@ public NullTerminatedString()
data = ReadOnlySpan.Empty;
}
- internal NullTerminatedString(ref byte[] str)
+ private NullTerminatedString(ReadOnlySpan data)
{
- data = str;
+ this.data = data;
+ }
+
+ internal static NullTerminatedString WithUnicode(string str)
+ {
+ var src = Encoding.Unicode.GetBytes(str);
+ var dest = new byte[src.Length + sizeof(ushort)];
+ Array.Copy(src, dest, src.Length);
+
+ return new NullTerminatedString(dest);
+ }
+
+ internal static NullTerminatedString WithUtf32(string str)
+ {
+ var src = Encoding.UTF32.GetBytes(str);
+ var dest = new byte[src.Length + sizeof(uint)];
+ Array.Copy(src, dest, src.Length);
+
+ return new NullTerminatedString(dest);
}
public ref readonly byte GetPinnableReference() => ref data.GetPinnableReference();
diff --git a/src/HidApi.Net/Internal/Unicode.cs b/src/HidApi.Net/Internal/Unicode.cs
index e4f8db1..a2f0ba7 100644
--- a/src/HidApi.Net/Internal/Unicode.cs
+++ b/src/HidApi.Net/Internal/Unicode.cs
@@ -4,15 +4,6 @@ namespace HidApi;
internal static class Unicode
{
- public static NullTerminatedString CreateNullTerminatedString(string str)
- {
- var src = Encoding.Unicode.GetBytes(str);
- var dest = new byte[src.Length + sizeof(ushort)];
- Array.Copy(src, dest, src.Length);
-
- return new NullTerminatedString(ref dest);
- }
-
public static ReadOnlySpan CreateBuffer(int size)
{
return new byte[size * sizeof(ushort)];
diff --git a/src/HidApi.Net/Internal/Utf32.cs b/src/HidApi.Net/Internal/Utf32.cs
index 7a03487..23b4846 100644
--- a/src/HidApi.Net/Internal/Utf32.cs
+++ b/src/HidApi.Net/Internal/Utf32.cs
@@ -4,15 +4,6 @@ namespace HidApi;
internal static class Utf32
{
- public static NullTerminatedString CreateNullTerminatedString(string str)
- {
- var src = Encoding.UTF32.GetBytes(str);
- var dest = new byte[src.Length + sizeof(uint)];
- Array.Copy(src, dest, src.Length);
-
- return new NullTerminatedString(ref dest);
- }
-
public static ReadOnlySpan CreateBuffer(int size)
{
return new byte[size * sizeof(uint)];
diff --git a/src/HidApi.Net/Internal/WCharT.cs b/src/HidApi.Net/Internal/WCharT.cs
index 11afe84..499e948 100644
--- a/src/HidApi.Net/Internal/WCharT.cs
+++ b/src/HidApi.Net/Internal/WCharT.cs
@@ -50,13 +50,13 @@ public static ReadOnlySpan CreateBuffer(int size)
public static NullTerminatedString CreateNullTerminatedString(string str)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
- return Utf32.CreateNullTerminatedString(str);
+ return NullTerminatedString.WithUtf32(str);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
- return Unicode.CreateNullTerminatedString(str);
+ return NullTerminatedString.WithUnicode(str);
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
- return Utf32.CreateNullTerminatedString(str);
+ return NullTerminatedString.WithUtf32(str);
throw new NotSupportedException("Unsupported platform to create a null terminated string");
}