diff --git a/.global.editorconfig.ini b/.global.editorconfig.ini
index 9f7e7ba2eb..0f0125bb50 100644
--- a/.global.editorconfig.ini
+++ b/.global.editorconfig.ini
@@ -376,6 +376,11 @@ dotnet_diagnostic.MEN015.severity = silent
# Use object-oriented methods instead of top-level statements
dotnet_diagnostic.MEN016.severity = silent
+## Microsoft.CodeAnalysis.BannedApiAnalyzers rules
+
+# Do not use banned APIs
+dotnet_diagnostic.RS0030.severity = error
+
## StyleCop spacing rules
# Keywords should be spaced correctly
diff --git a/Directory.Packages.props b/Directory.Packages.props
index d9e3da72c2..0459d3107f 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -9,6 +9,7 @@
+
diff --git a/src/BannedSymbols.BannedApiAnalyzers.txt b/src/BannedSymbols.BannedApiAnalyzers.txt
new file mode 100644
index 0000000000..56c710d642
--- /dev/null
+++ b/src/BannedSymbols.BannedApiAnalyzers.txt
@@ -0,0 +1,11 @@
+M:System.Convert.ToByte(System.String);use byte.{Try,}Parse
+M:System.Convert.ToDecimal(System.String);use decimal.{Try,}Parse
+M:System.Convert.ToDouble(System.String);use double.{Try,}Parse
+M:System.Convert.ToInt16(System.String);use short.{Try,}Parse
+M:System.Convert.ToInt32(System.String);use int.{Try,}Parse
+M:System.Convert.ToInt64(System.String);use long.{Try,}Parse
+M:System.Convert.ToSByte(System.String);use sbyte.{Try,}Parse
+M:System.Convert.ToSingle(System.String);use float.{Try,}Parse
+M:System.Convert.ToUInt16(System.String);use ushort.{Try,}Parse
+M:System.Convert.ToUInt32(System.String);use uint.{Try,}Parse
+M:System.Convert.ToUInt64(System.String);use ulong.{Try,}Parse
diff --git a/src/BizHawk.Client.Common/movie/BasicMovieInfo.cs b/src/BizHawk.Client.Common/movie/BasicMovieInfo.cs
index f0ee477487..9363af26bb 100644
--- a/src/BizHawk.Client.Common/movie/BasicMovieInfo.cs
+++ b/src/BizHawk.Client.Common/movie/BasicMovieInfo.cs
@@ -48,8 +48,8 @@ namespace BizHawk.Client.Common
if (Header.TryGetValue(HeaderKeys.CycleCount, out var numCyclesStr) && Header.TryGetValue(HeaderKeys.ClockRate, out var clockRateStr))
{
- var numCycles = Convert.ToUInt64(numCyclesStr);
- var clockRate = Convert.ToDouble(clockRateStr, CultureInfo.InvariantCulture);
+ var numCycles = ulong.Parse(numCyclesStr);
+ var clockRate = double.Parse(clockRateStr, CultureInfo.InvariantCulture);
numSeconds = numCycles / clockRate;
}
else
@@ -68,8 +68,10 @@ namespace BizHawk.Client.Common
{
if (SystemID == VSystemID.Raw.Arcade && Header.TryGetValue(HeaderKeys.VsyncAttoseconds, out var vsyncAttoStr))
{
- const decimal attosInSec = 1000000000000000000;
- return (double)(attosInSec / Convert.ToUInt64(vsyncAttoStr));
+ const decimal attosInSec = 1_000_000_000_000_000_000.0M;
+ var m = attosInSec;
+ m /= ulong.Parse(vsyncAttoStr);
+ return checked((double) m);
}
else
{
diff --git a/src/BizHawk.Client.EmuHawk/movie/PlayMovie.cs b/src/BizHawk.Client.EmuHawk/movie/PlayMovie.cs
index d3e8603cce..62e935ebd1 100644
--- a/src/BizHawk.Client.EmuHawk/movie/PlayMovie.cs
+++ b/src/BizHawk.Client.EmuHawk/movie/PlayMovie.cs
@@ -422,7 +422,7 @@ namespace BizHawk.Client.EmuHawk
}
break;
case HeaderKeys.VsyncAttoseconds:
- if (_emulator is MAME mame && mame.VsyncAttoseconds != Convert.ToInt64(v))
+ if (_emulator is MAME mame && mame.VsyncAttoseconds != long.Parse(v))
{
item.BackColor = Color.Pink;
item.ToolTipText = $"Expected: {v}\n Actual: {mame.VsyncAttoseconds}";
diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/PatternsForm.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/PatternsForm.cs
index 3ed4f51e6a..59476f2376 100644
--- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/PatternsForm.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/PatternsForm.cs
@@ -110,7 +110,7 @@ namespace BizHawk.Client.EmuHawk
return;
}
- _values[PatternList.SelectedIndex] = ValueNum.Value.ToString(NumberFormatInfo.InvariantInfo);
+ _values[PatternList.SelectedIndex] = unchecked((int) ValueNum.Value).ToString(NumberFormatInfo.InvariantInfo);
UpdatePattern();
UpdateDisplay();
}
@@ -217,7 +217,7 @@ namespace BizHawk.Client.EmuHawk
}
LagBox.Checked = _tastudio.AxisPatterns[index].SkipsLag;
- ValueNum.Value = Convert.ToDecimal(_values[PatternList.SelectedIndex]);
+ ValueNum.Value = int.Parse(_values[PatternList.SelectedIndex]);
CountNum.Value = _counts[PatternList.SelectedIndex];
}
}
@@ -267,7 +267,7 @@ namespace BizHawk.Client.EmuHawk
{
for (int c = 0; c < _counts[i]; c++)
{
- p.Add((int) Convert.ToSingle(_values[i]));
+ p.Add(int.Parse(_values[i]));
}
}
diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs
index ecb8060e02..792dec5acd 100644
--- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs
@@ -1323,14 +1323,7 @@ namespace BizHawk.Client.EmuHawk
}
_axisTypedValue = _axisTypedValue.Substring(startIndex: 0, length: _axisTypedValue.Length - 1); // drop last char
- if (_axisTypedValue == "" || _axisTypedValue == "-")
- {
- value = 0f;
- }
- else
- {
- value = Convert.ToSingle(_axisTypedValue);
- }
+ if (!float.TryParse(_axisTypedValue, out value)) value = 0.0f;
}
else if (e.KeyCode == Keys.Enter)
{
diff --git a/src/BizHawk.Emulation.Cores/CPUs/FairchildF8/F3850.Registers.cs b/src/BizHawk.Emulation.Cores/CPUs/FairchildF8/F3850.Registers.cs
index 7dd49c228b..dfae8a6e33 100644
--- a/src/BizHawk.Emulation.Cores/CPUs/FairchildF8/F3850.Registers.cs
+++ b/src/BizHawk.Emulation.Cores/CPUs/FairchildF8/F3850.Registers.cs
@@ -241,6 +241,8 @@ namespace BizHawk.Emulation.Cores.Components.FairchildF8
}
}
+ private const string PFX_SCRATCHPAD_REG = "SPR";
+
public IDictionary GetCpuFlagsAndRegisters()
{
var res = new Dictionary
@@ -266,7 +268,7 @@ namespace BizHawk.Emulation.Cores.Components.FairchildF8
for (int i = 0; i < 64; i++)
{
- res.Add("SPR" + i, Regs[i]);
+ res.Add(PFX_SCRATCHPAD_REG + i, Regs[i]);
}
return res;
@@ -274,9 +276,9 @@ namespace BizHawk.Emulation.Cores.Components.FairchildF8
public void SetCpuRegister(string register, int value)
{
- if (register.StartsWithOrdinal("SPR"))
+ if (register.StartsWithOrdinal(PFX_SCRATCHPAD_REG))
{
- var reg = Convert.ToInt32(register.Replace("SPR", ""));
+ var reg = int.Parse(register.Substring(startIndex: PFX_SCRATCHPAD_REG.Length));
if (reg > 63)
{
diff --git a/src/MainSlnCommon.props b/src/MainSlnCommon.props
index c28261ab53..f361b73871 100644
--- a/src/MainSlnCommon.props
+++ b/src/MainSlnCommon.props
@@ -18,7 +18,9 @@
false
+
+