SubC.AllegroDotNet 0.11.0

dotnet add package SubC.AllegroDotNet --version 0.11.0                
NuGet\Install-Package SubC.AllegroDotNet -Version 0.11.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="SubC.AllegroDotNet" Version="0.11.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add SubC.AllegroDotNet --version 0.11.0                
#r "nuget: SubC.AllegroDotNet, 0.11.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.
// Install SubC.AllegroDotNet as a Cake Addin
#addin nuget:?package=SubC.AllegroDotNet&version=0.11.0

// Install SubC.AllegroDotNet as a Cake Tool
#tool nuget:?package=SubC.AllegroDotNet&version=0.11.0                

AllegroDotNet

❓ What is it?

The AllegroDotNet project aims to make the Allegro 5 game programming library available in C# and feel .NET-like. Using AllegroDotNet will allow you to create game and multimedia applications in C#.

⭐ Requirements

  • A native Allegro 5.2.x library binary.

💥 Quick Start (Windows)

  1. Add NuGet package references to SubC.AllegroDotNet and SubC.AllegroDotNet.Win64.

  2. Add the following test code to your source code:

using SubC.AllegroDotNet;
// ...
Al.Init();
var display = Al.CreateDisplay(1280, 720) ?? throw new Exception();
Al.Rest(3);
Al.DestroyDisplay(display);
Al.UninstallSystem();
  1. Compile and run.

For more example code, see the Source/Ex.<whatever> projects such as Source/Ex.Camera/.

🔥 Slow Start

AllegroDotNet is a wrapper for the Allegro 5 library. Care was taken to make Allegro feel like .NET, instead of a tool-generated wrapper that requires you to pass IntPtr everywhere.

You must provide the native Allegro 5 library, but the NuGet package SubC.AllegroDotNet.Win64 can provide it for you if you are targeting Windows.

The 'bit-ness' of your .NET application must match the version of Allegro 5: if you're targetting AnyCPU in your .NET application, and your OS is 64-bit, then you must provide the x64 library version of Allegro 5 or it won't work.

Existing documentation of Allegro 5 is valid with AllegroDotNet. The static class Al contains all the Allegro 5 functions.

Function names have changed, so that what was al_init() in C has now become Al.Init() in C#.

💾 Native Allegro 5 Library

Remember to match 'bit-ness': if your .NET application is targetting AnyCPU, then it will be x86 on 32-bit systems, and x64 on 64-bit systems. The same version of Allegro 5 will not work on both: you must make sure you provide the correct version of the native Allegro 5 library for your target architecture.

The native Allegro library may require a runtime for your target platform, such as the Visual C++ Redistributable vc_redist.x64.exe on Windows. Your development machine may already have this installed, but other machines may not. This is a requirement you can forget about when testing on other machines.

The method Al.Init() tries to initialize Allegro with any known versions in the LibraryVersion enumeration. If you want/need to specify the version, you need to call Al.InstallSystem() instead.

When specifying the version of Allegro 5 with Al.InstallSystem(), you can provide either an integer of the version as per usual from C, or use the enumeration LibraryVersion to specify some well-known versions such as 5.2.8 (LibraryVersion.V528).

📰 Differences Between Allegro and AllegroDotNet

  • All Allegro functions are provided in the Al static class (example: Al.InstallKeyboard()).

  • Most Allegro 5 opaque types (example: ALLEGRO_BITMAP*) are turned into classes (example: AllegroBitmap). They are located in the SubC.AllegroDotNet.Models namespace.

  • The remaining Allegro 5 types (example: ALLEGRO_COLOR) are turned into structures (example: AllegroColor). You will often need to pass them with the ref keyword to facilitate marshalling them to the native C library correctly and quickly.

  • Allegro 5 constant values (example: ALLEGRO_NO_PRESERVE_TEXTURE) are grouped into enumerations (example: BitmapFlags.NoPreserveTexture). These enumerations are in the SubC.AllegroDotNet.Enums namespace.

  • Allegro 5 macros (example: ALLEGRO_BPS_TO_SECS(x)) are turned into static methods (example: Al.BpsToSecs(x)).

  • The method Al.Init() only is aware of versions in the LibraryVersion enumeration. If you need to initialize a version of Allegro not in this enumeration, you need to call Al.InstallSystem() with the correct integer parameter (same as from C code).

  • When calling Al.InitUserEventSource(), native memory is allocated for the event source. When you are done with the event source, call Al.DestroyUserEventSource(). This is different than native Allegro 5 where the ALLEGRO_EVENT_SOURCE is allocated by the user, instead of the API methods.

  • If the Allegro function takes or returns a string, that involves extra marshalling from managed/unmanaged code. While this isn't "slow", it isn't as fast as passing pointers and numbers around.

📝 Custom Interop Providers

AllegroDotNet has built-in interop providers for Windows, OS X, and Linux. These built-in providers expect to find the default, non-debug names of the Allegro 5 library when trying to load functions (ex: allegro-5.2.dll).

If you want to support other operating systems or the debug-named Allegro 5 library, you can create your own interop provider. To do so:

  • Make a class that implements the SubC.AllegroDotNet.Native.IInteropProvider interface (see the existing interop providers for examples).
  • Call Al.SetupInteropProvider() before you call any Allegro function, passing it your custom interop provider.
  • Call AllegroDotNet functions as usual.

⚠️ Troubleshooting

  • If you get "access violation" errors when trying to call to Allegro functions, ensure you do not have multiple versions of the Allegro library in your path. For example, on Windows systems, if you have a MinGW Allegro .DLL file in the path, and another VC++ Allegro .DLL next to your .EXE, AllegroDotNet will load both libraries and can invoke the function from the wrong .DLL library.

    • If this is a legitimate concern for you, you may provide your own more strict interop provider. See the above 'Custom Interop Providers' section for how to write your own.
  • If you get "unbalanced stack" or "attempted to read or write protected memory" errors, ensure your application is running the correct "bit-ness" that matches the version of Allegro 5 being used. You cannot use x64 Allegro 5 in your 32-bit .NET application or vice-versa.

  • If calling Al.InstallSystem() is failing, ensure the version of Allegro 5 you are trying to load is available. You cannot load Allegro 5.2.8 if you pass LibraryVersion.V529 (5.2.9) to Al.InstallSystem(). Also ensure the library files (ie, .DLL files on Windows) are available to your executable.

  • If you get "missing function" errors, you may be using a native version of Allegro 5 that does not have functions available that are expected by AllegroDotNet. For example, if you did not include audio or acodec support in your Allegro 5 library, but you try to use any of those functions, you will get an error.

  • You may get errors if your native library files do not have their dependencies available or are not statically linked. You can solve this by providing the needed libraries (flac.dll, zlib.dll, etc) or by using a statically-linked native Allegro library.

❌ Unimplemented Routines

  • Any function marked as "Unstable API" (ex: haptic functions).
  • PhysFS addon, as this would also require wrapping the PhysFS library.
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

    • No dependencies.
  • net6.0

    • No dependencies.
  • net8.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
0.11.0 98 11/29/2024
0.10.0 114 9/2/2024
0.9.4 109 8/27/2024
0.9.3 134 8/24/2024
0.9.2 123 8/11/2024
0.9.1 152 5/4/2024
0.9.0 303 2/17/2024
0.8.2 601 10/3/2023
0.8.1-pre 656 7/22/2023 0.8.1-pre is deprecated because it has critical bugs.
0.7.10 584 10/2/2023
0.7.9 812 4/8/2023
0.7.2 953 1/15/2023
0.7.1 965 12/10/2022
0.6.42 1,118 9/10/2022
0.6.39 1,167 8/21/2022
0.6.38 1,147 8/14/2022
0.6.33 905 8/13/2022
0.6.28 934 6/25/2022
0.6.22 932 6/18/2022
0.6.6 899 6/13/2022
0.6.6-debug 614 6/13/2022
0.6.5 914 6/12/2022
0.6.5-debug 677 6/12/2022
0.6.1 920 6/10/2022
0.6.1-debug 634 6/10/2022
0.5.42 869 5/30/2022
0.5.42-debug 675 5/30/2022
0.5.41 934 5/14/2022
0.5.41-debug 664 5/14/2022
0.5.39 919 5/13/2022
0.5.39-debug 625 5/13/2022
0.5.38 913 5/12/2022
0.5.38-debug 648 5/12/2022
0.5.37 941 5/10/2022
0.5.37-debug 643 5/10/2022
0.5.36 896 5/8/2022
0.5.36-debug 627 5/8/2022
0.5.28 907 4/30/2022
0.5.28-debug 666 4/30/2022

Updated LibraryVersion enum for Allegro v5.2.10.