https://github.com/tinysec/sharp-binaryninja
BinaryNinja dotnet C# Bindings (Typed, Safe, Native AOT Ready)
https://github.com/tinysec/sharp-binaryninja
binaryninja dotnet
Last synced: about 12 hours ago
JSON representation
BinaryNinja dotnet C# Bindings (Typed, Safe, Native AOT Ready)
- Host: GitHub
- URL: https://github.com/tinysec/sharp-binaryninja
- Owner: tinysec
- License: gpl-3.0
- Created: 2025-11-24T13:21:28.000Z (8 months ago)
- Default Branch: master
- Last Pushed: 2026-07-06T05:52:19.000Z (10 days ago)
- Last Synced: 2026-07-06T06:08:02.891Z (10 days ago)
- Topics: binaryninja, dotnet
- Language: C#
- Homepage:
- Size: 1.32 MB
- Stars: 23
- Watchers: 0
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# BinaryNinja C# Bindings (Typed, Safe, Native AOT Ready)
[](https://www.nuget.org/packages/BinaryNinja)



Modern, fully statically typed C# bindings for the Binary Ninja C API. Designed for safety, performance, and Native AOT compatibility.
Use it as a dynamic library in your apps, compile CLI tools with Native AOT, or build native Binary Ninja plugins.
- Statically typed API surface
- 100% SafeHandle-based resource management
- Idiomatic IDisposable/Dispose pattern
- Native AOT friendly (no reflection-heavy runtime dependencies)
- Works with .NET 8.0+
## WARNING
- Do not use this in production. The API is experimental and may introduce breaking changes without notice.
## Install
```shell
dotnet add package BinaryNinja
```
## Requirements
- .NET 8.0 or newer
- Binary Ninja installed (Desktop or Headless)
- Ensure the Binary Ninja native libraries are discoverable at runtime:
- environment variable: BINARYNINJA_BASE or BINARYNINJA_HOME (points to Binary Ninja installation root)
## Using in cli
```csharp
using System;
using BinaryNinja;
class Program
{
static void Main()
{
NativeLibrary.SetDllImportResolver(
typeof(BinaryNinja.Core).Assembly,
new LibraryResolver().ResolveDllImport
);
Core.InitPlugins(true);
using BinaryView? view = BinaryView.LoadFile("driver.sys.bndb");
if (null == view)
{
throw new Exception("load fail");
}
foreach(Function function in view.Functions)
{
Console.WriteLine(function.RawName);
}
Core.Shutdown();
}
}
```
## Using in Plugin
```csharp
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using BinaryNinja;
namespace Dummy
{
public static class Plugin
{
static Plugin()
{
NativeLibrary.SetDllImportResolver(
typeof(BinaryNinja.Core).Assembly,
new LibraryResolver().ResolveDllImport
);
}
[UnmanagedCallersOnly(
EntryPoint = "CorePluginABIVersion",
CallConvs = new[] { typeof(System.Runtime.CompilerServices.CallConvCdecl) })
]
public static uint CorePluginABIVersion()
{
return BinaryNinja.Core.CurrentCoreABIVersion;
}
[UnmanagedCallersOnly(EntryPoint = "CorePluginInit", CallConvs = new[] { typeof(System.Runtime.CompilerServices.CallConvCdecl) })]
public static byte CorePluginInit()
{
BinaryNinja.Core.LogInfo("[+] i am native aot plugin\n");
BinaryNinja.Core.LogInfo( $"[+] Core CurrentCoreABIVersion: {Core.GetCurrentCoreABIVersion()}\n");
BinaryNinja.Core.LogInfo( $"[+] Core MinimumCoreABIVersion: {Core.GetMinimumCoreABIVersion()}\n");
BinaryNinja.Core.LogInfo( $"[+] Plugin CurrentCoreABIVersion: {Core.CurrentCoreABIVersion }\n");
BinaryNinja.Logger logger = BinaryNinja.Logger.GetOrCreateLogger("Dummy");
logger.LogInfo("[+] use private logger\n");
BinaryNinja.PluginCommand.RegisterPluginCommand(
"Dummy command",
"Dummy command description",
Plugin.DefaultCommand,
Plugin.DefaultIsValid
);
logger.LogInfo("[+] init done.");
return 1; // success
}
public static void DefaultCommand(BinaryView view )
{
Logger logger = BinaryNinja.Logger.GetOrCreateLogger("Dummy");
logger.LogInfo($"view length: {view.Length}");
Core.OpenUrl("https://github.com/tinysec/binaryninja");
Function? function = view.ChooseFunction();
if (null != function)
{
logger.LogInfo($"function , RawName: {function.RawName}");
}
}
public static bool DefaultIsValid(BinaryView view )
{
return true;
}
}
}
```
## Troubleshooting
- DllNotFoundException / EntryPointNotFoundException
- Ensure set BINARYNINJA_BASE
- On Native AOT, confirm your RID is correct and you published with PublishAot=true
- AccessViolationException
- Check lifetime: ensure using-statements dispose views/sessions before exit
- Make sure the target BN C API functions exist in the installed version