I recently needed to do this, so I spent firewalls for all the possible paths of the Windows SDK and looked at those that were found in the most famous order recently. I also check if the OS and the process are 64-bit, and then just use this version by looking at the corresponding Program Files folders. I donβt think that choosing a 64-bit version of 32-bit versions of tools is of great importance. The ILAsm x86 version can happily build 64-bit preferred assemblies without a hitch, this is all IL and does not actually execute any code.
ILDasm is part of the Windows SDK, where ILAsm is just the .NET Framework SDK, so here are some static methods for finding them. The code is baked for .NET 4.0, but you can do some minor tricks to get it on .NET 2.0 if you want.
// ILDasm.exe will be somewhere in here private static string FindPathForWindowsSdk() { string[] windowsSdkPaths = new[] { @"Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\", @"Microsoft SDKs\Windows\v8.0A\bin\", @"Microsoft SDKs\Windows\v8.0\bin\NETFX 4.0 Tools\", @"Microsoft SDKs\Windows\v8.0\bin\", @"Microsoft SDKs\Windows\v7.1A\bin\NETFX 4.0 Tools\", @"Microsoft SDKs\Windows\v7.1A\bin\", @"Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\", @"Microsoft SDKs\Windows\v7.0A\bin\", @"Microsoft SDKs\Windows\v6.1A\bin\", @"Microsoft SDKs\Windows\v6.0A\bin\", @"Microsoft SDKs\Windows\v6.0\bin\", @"Microsoft.NET\FrameworkSDK\bin" }; foreach (var possiblePath in windowsSdkPaths) { string fullPath = string.Empty; // Check alternate program file paths as well as 64-bit versions. if (Environment.Is64BitProcess) { fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), possiblePath, "x64"); if (Directory.Exists(fullPath)) { return fullPath; } fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), possiblePath, "x64"); if (Directory.Exists(fullPath)) { return fullPath; } } fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), possiblePath); if (Directory.Exists(fullPath)) { return fullPath; } fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), possiblePath); if (Directory.Exists(fullPath)) { return fullPath; } } return null; } // ILAsm.exe will be somewhere in here private static string FindPathForDotNetFramework() { string[] frameworkPaths = new[] { @"Microsoft.NET\Framework\v4.0.30319", @"Microsoft.NET\Framework\v2.0.50727" }; foreach (var possiblePath in frameworkPaths) { string fullPath = string.Empty; if (Environment.Is64BitProcess) { fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), possiblePath.Replace(@"\Framework\", @"\Framework64\")); if (Directory.Exists(fullPath)) { return fullPath; } } fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), possiblePath); if (Directory.Exists(fullPath)) { return fullPath; } } return null; }
You can increase this by passing to the executable you are looking for, and change Directory.Exists from File.Exists as well, up to you. You can also take possible lists and put them in a configuration file so that you can add more without recompiling.
Brutaldev
source share