- AddedArmDot supports .NET 10.0.
Changelog
Stay up to date - subscribe to the ArmDot changelog feed
Latest release
Version 2025.9 - Released October 9, 2025
2025
- FixedA method with a localloc instruction might crash after applying control flow obfuscation.
- FixedIf ArmDot.Client.Api.PutKey was used in a .NET 9 project, the obfuscation task failed with an error indicating that an assembly reference for the type System.Management.ManagementObjectCollection could not be found.
- FixedBy mistake, ArmDot obfuscated the name of the compiler-generated Settings class, which is used to store user settings in WinForms applications.
- FixedArmDot.exe crashed on startup.
- FixedObfuscation of types derived from System.Windows.Forms.Form now correctly applies when marked with the ObfuscateNames attribute.
- FixedArmDot generated invalid IL code during virtualization when the original method contained calls to methods with a return type of ref struct.
- FixedArmDot crashed when running on .NET 9.0.1.
- FixedAddressed an issue where enabling hotpatching on Windows 11 caused DLLs loaded from embedded files to fail after installing the 2024-11 Cumulative Update Preview for Windows 11, Version 24H2 for x64-based Systems (KB5046740).
2024
- FixedResolved an issue where the hardware ID could unexpectedly change, even though the hardware itself had not been altered.
- FixedIn some cases, after applying control flow obfuscation or virtualization, the finally block was not executed when an exception was thrown from the corresponding try block.
- FixedIf the license key was not entered, the standalone ArmDot and ArmDotConsole unexpectedly stopped with the error "The ArmDot license is invalid".
- FixedThe types, methods, and fields generated by ArmDot are now set as non-public.
- AddedArmDot stops obfuscation if the license has expired.
- AddedArmDot supports .NET 9.0.
- FixedFixed errors in exception handling within obfuscated methods.
- FixedIn some instances, ArmDot was unable to implement the feature integrity check for assemblies.
- AddedAdded an experimental feature for integrity checking.
- FixedResolved an issue where ArmDot was incorrectly virtualizing arrays of enums.
2023
- FixedThe XamlC task encountered an error while attempting to process assemblies that were obfuscated by ArmDot.
- AddedArmDot supports .NET 8.0.
- FixedArmDot stopped working unexpectedly.
- AddedImproved the string hiding algorithm.
- FixedIn some cases, ArmDot incorrectly obfuscated the names of generic methods.
- FixedIf a type had both ObfuscateNames and ObfuscationAttribute, ArmDot ignored the ObfuscationAttribute. For example, if the ObfuscationAttribute had settings such as Exclude = true and ApplyToMembers = false, and ArmDot.Client.ObfuscateNames(Enable = true, Inherit = true) was applied, the type would still be obfuscated.
- FixedArmDot obfuscated the names of fields that were marked with the System.Runtime.Serialization.DataMemberAttribute.
- FixedIf virtualization was not supported for a method, the remaining obfuscation options were not applied.
- FixedIf an assembly's PDB was invalid, ArmDot would not obfuscate the assembly.
- FixedIf a project that utilized the license API was targeting .NET 6.0, the project could not be built.
- FixedSome virtualized methods may unexpectedly throw System.IndexOutOfRangeException.
- FixedSometimes ArmDot failed to virtualize a method when name obfuscation was enabled.
2022
- AddedSometimes ArmDot failed to obfuscate an application with a target framework of .NET 4.8.1.
- AddedArmDot now supports .NET 4.8.1.
- AddedSometimes ArmDot would fail to virtualize methods.
- AddedArmDot would fail when attempting to virtualize a method without a body.
- AddedArmDot now supports .NET 7.0.
- FixedArmDot now displays a clear error message if the file to be embedded does not exist.
- FixedException handlers were being called in the wrong order after virtualization or control flow obfuscation.
- FixedVisual Studio might hang when loading a project with the ArmDot obfuscator task.
- FixedArmDot may fail to virtualize .NET 6 WPF applications.
- FixedImproved compatibility with Mono.
- FixedSometimes ArmDot UI failed to load obfuscation options for methods and types.
- AddedArmDot encrypts global string literals when the 'hide string' option is enabled.
- AddedArmDot.Engine.MSBuildTasks.ObfuscateTask supports generating map files for deobfuscating stack traces.
- AddedArmDot generates map files for deobfuscating stack traces.
- FixedArmDot failed to run on Linux when a .NET version newer than 3.0 was installed.
- FixedBlazor assemblies may fail to run after obfuscation in .NET 6.
- FixedArmDot may fail to virtualize certain methods with generics.
- AddedNew parameter, SkipAlreadyObfuscatedAssemblies, added to ArmDot.Engine.MSBuildTasks.ObfuscateTask.
- FixedApplications targeting .NET Framework 4.8 may crash upon startup.
- FixedIn certain cases, ArmDot failed to virtualize a method when it had an exception filter.
- AddedExecutables obfuscated by ArmDot no longer display a nag screen.
2021
- AddedThe ArmDot UI allows you to set any obfuscation options for items.
- FixedArmDot incorrectly processed assembly names specified in the InternalsVisibleToAttribute if they contained a dot.
- FixedArmDotConsole only obfuscated the first assembly, despite multiple assemblies being specified.
- FixedArmDot didn't utilize the type obfuscation options stored in a project.
- AddedArmDot UI did not display obfuscation options for types.
- AddedNew parameter, TreatAllWarningsAsErrors, added to ArmDot.Engine.MSBuildTasks.ObfuscateTask.
- FixedIf embedded resource protection was enabled, some assemblies failed to run.
- AddedArmDot supports .NET 6.0.
- AddedArmDot obfuscates namespaces.
- AddedNew parameter, LicenseFile, added to ArmDot.Engine.MSBuildTasks.ObfuscateTask.
- FixedArmDot mistakenly renamed the protected methods.
- AddedArmDot now provides support for assembly signing.
- AddedArmDot may encounter difficulties in virtualizing certain methods within a UWP application.
- AddedArmDot now offers support for obfuscating UWP applications.
- FixedThe tasks from the NuGet package ArmDot.Engine.MSBuildTasks cannot be used when the project is built using 'dotnet build'.
- FixedMono might fail to execute virtualized code when the original code used a value type from another assembly.
- FixedArmDot virtualized a method that called an open generic method.
- FixedFixed warnings related to the ArmDot NuGet packages by embedding the icon and license into the packages.
- FixedFixed an issue where the virtualized code of a method was incorrect when its declaring type was an open generic type.
- FixedArmDot will no longer virtualize a method if it uses a field with an open generic type.
- FixedArmDot now excludes the virtualization of a method if it contains an unused variable of an open generic type.
- FixedArmDot previously did not virtualize a method if it contained an unused parameter of an open generic type.
- FixedArmDot mistakenly virtualized a method containing a variable of an open generic type, despite virtualization not being supported in such cases.
- FixedArmDot incorrectly virtualized a method when it included a parameter of an open generic type, even though virtualization is not supported in such cases.
- FixedArmDotConsole encountered an issue where it would not correctly write the obfuscated assembly if a relative path was specified using the --output-assembly option.
- FixedThe virtualized code produced an incorrect result when the original code used brtrue/brfalse with an object reference.
2020
- FixedThe ArmDot licensing API failed to verify a license key if an empty hardware ID was provided.
- FixedThe virtualized code was behaving incorrectly when the original code contained constrained/callvirt operations.
- FixedIf a Xamarin application is virtualized by ArmDot, Visual Studio might encounter deployment issues when trying to deploy the application to an Android device.
- FixedWhen archiving a Xamarin project in Visual Studio, there is a possibility that ArmDot.Engine.MSBuildTasks.ObfuscateTask might crash.
- FixedIn certain scenarios, ArmDot failed to virtualize a method.
- FixedIncreased speed of method virtualization.
- AddedArmDotConsole and ArmDot.Engine.MSBuildTasks.ObfuscateTask now support reference paths.
- FixedIn certain cases, ArmDot was unable to obfuscate the control flow of a method.
- AddedThe ArmDot.Client.Dll assembly is now strong-named.
- FixedArmDot removed an ObfuscationAttribute, even if it was unknown to ArmDot.
- AddedAdded a new property NoWarn to ArmDot.Engine.MSBuildTasks.ObfuscateTask.
- AddedAdded support for .NET 5.
- FixedFailed to add ArmDot.Engine.MSBuildTasks.ObfuscateTask to the project.
- AddedIntroduced a new property, EmbeddedFiles, in ArmDot.Engine.MSBuildTasks.ObfuscateTask.
- AddedArmDot now logs information about embedded files in the build log.
- FixedThe EmbedFileAttribute can now be applied multiple times.
- AddedArmDot now supports virtualization of methods that return instantiated generic types.
- AddedArmDotConsole now supports obfuscation without requiring a project file.
- AddedBy default, ArmDot now writes the obfuscated assembly to the same file.
- FixedFixed an issue where name obfuscation would sometimes fail.
- AddedAdded support for Xamarin.
- FixedImproved obfuscation speed.
- FixedResolved issue where a virtualized method would occasionally crash when attempting to execute a 'switch' instruction.
- FixedAddressed an issue where ArmDot occasionally failed to virtualize a method that included the 'starg' instruction.
- FixedResolved a crash issue in virtualized code occurring when calling generic methods.
- FixedWhen name obfuscation was enabled, the build log displayed new names instead of the original ones.
- AddedArmDotConsole now displays an error message if either the user data or hardware ID is incorrect.
- FixedResolved a crash issue in ArmDotConsole that occurred when the hardware ID was not passed.
- AddedIntroduced a new property, ProjectPath, to the ArmDot.Engine.MSBuildTasks.ObfuscateTask.
- FixedResolved an issue where embedded files failed to run on .NET 4.7.2.
- AddedAdded a NuGet package for ArmDot.Client.
- AddedAdded a .NET Core version of ArmDot that is compatible with Linux and macOS operating systems.
- FixedResolved the issue where ArmDot was unable to locate certain types from the installed .NET Core runtimes.
- FixedFixed the issue where if certain obfuscation options could not be applied to a method, the method was skipped and obfuscation continued.
- FixedResolved an issue where the ArmDot UI occasionally failed to display protection options for items.
- FixedAddressed an issue where ArmDot would occasionally generate incorrect code for a virtualized method that contained "endfinally".
- AddedIntroduced new attributes: EmbedFileAttribute, HideStringsAttribute, ObfuscateControlFlowAttribute, ObfuscateNamesAttribute, and ProtectEmbeddedResourcesAttribute.
- FixedCorrected issue where ObfuscationAttribute was not removed even when StripAfterObfuscation was set to true.
- FixedAddressed problem where a virtualized method would pass an incorrect value when calling a method with a System.Single parameter.
- AddedThe UI now supports nested types display.
- FixedAddressed an issue where ArmDot failed to remove the VirtualizeCodeAttribute attribute from certain methods.
- FixedResolved the problem of incorrect saving and loading of paths for embedded files (using full paths instead of relative paths to the project root).
- AddedAdded support for .NET Core and .NET Standard.
- AddedEnhanced the speed of virtualized methods.
- FixedAn issue where an application with protected resources could crash under .NET 2.0.
- AddedImplemented a control flow obfuscation feature.
2019
- AddedImplemented name obfuscation feature.
- FixedWhen a method threw an exception during virtualization, an exception of incorrect type was thrown.
- FixedProtected WPF applications might fail to locate resources if they were protected by ArmDot.
- FixedProtected code execution might have caused an InvalidProgramException.
- AddedArmDot now supports embedded resource protection.
- FixedArmDot might fail to protect an assembly if it references old versions of ArmDot.Client.dll.
- FixedArmDot threw an exception when the user switched to Files.
- AddedArmDot now utilizes the source assembly directory for resolving dependencies.
- AddedArmDot now supports locking the license key to the hardware.
- FixedArmDot would sometimes encounter processing errors when "Encrypt strings in all methods" was enabled for the entire assembly and the assembly included a PInvoke method.
- FixedArmDot previously had a potential issue where it might fail to generate a PDB file for a protected assembly. This issue has been resolved.
- FixedArmDot now correctly shows assemblies when a project is loaded from the Windows Explorer.
- AddedImproved protection capabilities.
2018
- AddedAdded the option for string encryption.
- FixedResolved an issue where ArmDot failed to process an assembly if its corresponding PDB file was not found.
- AddedUpdated the documentation.
- AddedEmbedded file content is now hidden.
- FixedFixed an issue where ArmDot would crash if a user selected two licenses and then deleted them.
- AddedFixed a potential crash issue in the protected executable.
- AddedAdded support for embedded files.
- AddedAdded expiration date, maximum build date, and user data to license information.
- AddedImproved string encryption.
- AddedAdded keygens for C/C++ and PHP.
- AddedInitial release.