diff --git a/src/BizHawk.Client.EmuHawk/tools/ExternalToolManager.cs b/src/BizHawk.Client.EmuHawk/tools/ExternalToolManager.cs
index b8b5c704d4..a69010e1f5 100644
--- a/src/BizHawk.Client.EmuHawk/tools/ExternalToolManager.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/ExternalToolManager.cs
@@ -117,10 +117,15 @@ namespace BizHawk.Client.EmuHawk
/// Generates a from an assembly at containing an external tool.
///
/// a with its containing a , or
- /// if the file is not a .NET assembly
+ /// if the file is not a .NET assembly or does not reference a BizHawk assembly
///
private ToolStripMenuItem/*?*/ GenerateToolTipFromFileName(string fileName)
{
+ ToolStripMenuItem/*?*/ Fail(string reason)
+ {
+ Console.WriteLine($"ignoring /{fileName.MakeRelativeTo(DirectoryMonitor.Path).RemovePrefix("./")} as {reason}");
+ return null;
+ }
if (fileName == null) throw new Exception();
var item = new ToolStripMenuItem(Path.GetFileName(fileName))
{
@@ -136,6 +141,10 @@ namespace BizHawk.Client.EmuHawk
var asmBytes = File.ReadAllBytes(fileName);
var externalToolFile = Assembly.Load(asmBytes);
#endif
+ if (!externalToolFile.GetReferencedAssemblies().Any(static name => name.Name.StartsWithOrdinal("BizHawk.")))
+ {
+ return Fail("it doesn't reference a BizHawk assembly");
+ }
var entryPoint = externalToolFile.GetTypes()
.SingleOrDefault(t => typeof(IExternalToolForm).IsAssignableFrom(t) && t.GetCustomAttributes().OfType().Any());
if (entryPoint == null) throw new ExternalToolAttribute.MissingException();
@@ -193,8 +202,7 @@ namespace BizHawk.Client.EmuHawk
}
catch (BadImageFormatException)
{
- Console.WriteLine($"ignoring /{fileName.MakeRelativeTo(DirectoryMonitor.Path).RemovePrefix("./")} as it doesn't seem to be an assembly (are you not targeting `net48`?)");
- return null;
+ return Fail("it doesn't seem to be an assembly (are you not targeting `net48`?)");
}
catch (Exception e)
{