OpenDisNet 0.9.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package OpenDisNet --version 0.9.0
                    
NuGet\Install-Package OpenDisNet -Version 0.9.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="OpenDisNet" Version="0.9.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="OpenDisNet" Version="0.9.0" />
                    
Directory.Packages.props
<PackageReference Include="OpenDisNet" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add OpenDisNet --version 0.9.0
                    
#r "nuget: OpenDisNet, 0.9.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package OpenDisNet@0.9.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=OpenDisNet&version=0.9.0
                    
Install as a Cake Addin
#tool nuget:?package=OpenDisNet&version=0.9.0
                    
Install as a Cake Tool

OpenDisNet

CI NuGet GitHub Release

OpenDisNet is a high-performance, type-safe .NET codec for Distributed Interactive Simulation (DIS) Protocol Version 7, defined by IEEE 1278.1-2012.

Development status: 0.9 release-candidate hardening. All 72 DIS v7 PDU identifiers have typed native C# codecs, every family has populated and boundary-truncation coverage, and the public API is frozen for external validation. See the RC testing guide and conformance matrix.

Install

dotnet add package OpenDisNet

Parse a datagram

using OpenDisNet;
using OpenDisNet.Enumerations;
using OpenDisNet.Pdus;

if (DisSerializer.TryDeserialize<SignalPdu>(datagram, out SignalPdu? signal, out DisParseError error))
{
    Console.WriteLine($"Radio {signal.Radio.Number}: {signal.DataBitLength} meaningful bits");
    audioDecoder.Decode(signal.Data, signal.SampleRate);
}
else
{
    Console.Error.WriteLine($"Byte {error.Offset}: {error.Message}");
}

The parser checks framing, protocol version, declared length, and field bounds. Unknown and vendor-defined PDU bodies are retained rather than discarded. Use DisSerializer.Serialize(pdu) for the reverse operation. See the public API design for the supported design rules.

Create and serialize a Signal PDU

Signal data normally comes from an audio codec, tactical-data-link implementation, file, or another application component. OpenDisNet handles its DIS framing without requiring callers to construct protocol bytes by hand.

using OpenDisNet;
using OpenDisNet.Pdus;

ReadOnlyMemory<byte> encodedAudio = audioEncoder.Encode(samples);

var signal = new SignalPdu
{
    ExerciseId = 1,
    Timestamp = 42,
    Radio = new RadioId(new EntityId(1, 10, 42), 7),
    EncodingScheme = SignalEncodingScheme.EncodedAudio(SignalEncodingType.Opus),
    TdlType = SignalTdlType.Other,
    SampleRate = 8_000,
    SampleCount = 1,
};
signal.SetData(encodedAudio.Span);

byte[] datagram = DisSerializer.Serialize(signal);

Protocol version, family, PDU type, PDU length, collection counts, and padding are managed by the library. Signal payload interpretation remains with the application because DIS can carry many audio encodings and tactical data-link formats. For the uncommon case of a non-byte-aligned payload, SetData also accepts an explicit meaningful bit length.

Typed wire values

Fields defined by SISO-REF-010 v36 use generated enums instead of unexplained integers. Composite bitfields expose named properties and immutable With... methods while retaining their complete wire value:

using OpenDisNet.Enumerations;

signal.TdlType = SignalTdlType.Link16StandardizedFormatJtidsMidsTadilJ;

var behavior = StopFreezeFrozenBehavior.None
    .WithRunSimulationClock(true)
    .WithProcessUpdates(true);

Forward compatibility is lossless. An unrecognized enumeration can be assigned with a normal enum cast, and unknown or reserved bitfield bits remain available through Value; parsing and reserialization preserve both exactly.

Standards and provenance

  • Wire format target: IEEE Std 1278.1-2012 (DIS v7).
  • Enumeration target: SISO-REF-010-2025 (version 36).
  • Cross-check sources include NPS MOVES Open-DIS projects and independent packet decoders. OpenDisNet is not a port and does not copy their public API design.
  • The NuGet package has no Java code, dependency, runtime requirement, or Java-facing API. Reference implementations supply test bytes only.

See the standards baseline and conformance matrix for exact, release-specific coverage, and architecture for the independent .NET design.

OpenDisNet is not affiliated with or endorsed by IEEE, SISO, NPS, or the U.S. Government. Users are responsible for obtaining standards needed for their own conformance review.

Build

dotnet restore
dotnet test --configuration Release
dotnet pack src/OpenDisNet/OpenDisNet.csproj --configuration Release

The library targets .NET 9 and .NET 10 and uses nullable annotations, deterministic builds, and symbol packages.

The implementation is reviewable in ordinary source files: PDU classes are grouped under src/OpenDisNet/Pdus/Families, all 72 binary dispatch paths are in src/OpenDisNet/Internal/PduCodec.cs, and checked big-endian primitives are under src/OpenDisNet/Binary.

Security

Treat network datagrams as untrusted. See SECURITY.md for the supported reporting process and parser safety guarantees.

License

MIT. See THIRD-PARTY-NOTICES.md for reference-source attribution.

Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net10.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.1.0 104 7/25/2026
1.0.2 103 7/23/2026
1.0.1 105 7/13/2026
1.0.0 181 7/13/2026
0.9.0 109 7/13/2026
0.8.0 109 7/13/2026
0.2.0 105 7/13/2026
0.1.1 102 7/13/2026
0.1.0 102 7/13/2026