You are viewing a plain text version of this content. The canonical link for it is here.
Posted to npanday-commits@incubator.apache.org by br...@apache.org on 2012/01/12 08:11:16 UTC

svn commit: r1230436 - /incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/GacUtility.cs

Author: brett
Date: Thu Jan 12 08:11:15 2012
New Revision: 1230436

URL: http://svn.apache.org/viewvc?rev=1230436&view=rev
Log:
[NPANDAY-517] don't require gacutil to be on the PATH

Modified:
    incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/GacUtility.cs

Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/GacUtility.cs
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/GacUtility.cs?rev=1230436&r1=1230435&r2=1230436&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/GacUtility.cs (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/GacUtility.cs Thu Jan 12 08:11:15 2012
@@ -29,6 +29,7 @@ using System.Text.RegularExpressions;
 
 using System.Reflection;
 using System.IO;
+using Microsoft.Win32;
 
 namespace NPanday.Utils
 {
@@ -46,12 +47,62 @@ namespace NPanday.Utils
             //  consider this: http://www.codeproject.com/KB/dotnet/undocumentedfusion.aspx
             //  (works, but seems to be missing the processor architecture)
             // Can also use LoadWithPartialName, but it is deprecated
-            
+
+            // First, let's find gacutil.exe. For now, we use .NET 4.0 if available to list everything and let
+            // the rest of the logic sort out the right ones - but we might want to pre-filter this to CLR 2.0
+            // and CLR 4.0 versions
+            string gacutil = "gacutil.exe";
+            Dictionary<string, KeyValuePair<string, string>> paths = new Dictionary<string, KeyValuePair<string, string>>();
+            try
+            {
+                RegistryKey sdks = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows");
+                foreach (string sdk in sdks.GetSubKeyNames())
+                {
+                    using (RegistryKey key = sdks.OpenSubKey(sdk)) 
+                    {
+                        foreach (string location in key.GetSubKeyNames())
+                        {
+                            using (RegistryKey subkey = key.OpenSubKey(location))
+                            {
+                                object value = subkey.GetValue("InstallationFolder");
+
+                                if (value != null)
+                                {
+                                    string exe = Path.Combine(value.ToString(), "gacutil.exe");
+                                    if (new FileInfo(exe).Exists)
+                                    {
+                                        // override with later ones in the list
+                                        paths.Add(location, new KeyValuePair<string,string>(sdk, exe));
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+                string[] search = new string[] { "WinSDK-NetFx40Tools", "WinSDK-NetFx40Tools-x86",  "WinSDK-NetFx35Tools", "WinSDK-NetFx35Tools-x86", "WinSDK-SDKTools" };
+
+                foreach (string s in search)
+                {
+                    if (paths.ContainsKey(s))
+                    {
+                        KeyValuePair<string, string> pair = paths[s];
+                        gacutil = pair.Value;
+                        Console.WriteLine("Found gacutil from SDK " + pair.Key + " at " + gacutil);
+                        break;
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine("Unable to find gacutil in the registry due to an exception: " + e);
+            }
+
             Process p = new Process();
 
             try
             {
-                p.StartInfo.FileName = "gacutil.exe";
+                p.StartInfo.FileName = gacutil;
                 p.StartInfo.Arguments = "/l";
                 p.StartInfo.UseShellExecute = false;
                 p.StartInfo.ErrorDialog = false;