public static bool Unregister(string name, string companyName)
        {
            var companyPath  = $@"Software\{companyName}";
            var softwarePath = $@"{companyPath}\{name}";
            var sofrwareKey  = Registry.LocalMachine.OpenSubKey(softwarePath);

            if (sofrwareKey != null)
            {
                // Prog ID 삭제
                var assocKey = sofrwareKey.OpenSubKey(@"Capabilities\FileAssociations");
                foreach (var extension in assocKey.GetValueNames())
                {
                    var progID = assocKey.GetValue(extension).ToString();
                    ProgIDUtility.DeleteProgID(progID, extension);
                }

                // Software 삭제
                Registry.LocalMachine.DeleteSubKeyTree(softwarePath);
                Registry.LocalMachine.OpenSubKey(@"Software\RegisteredApplications", true).DeleteValue(name);

                // Comapny 삭제
                if (Registry.LocalMachine.OpenSubKey(companyPath).SubKeyCount <= 0)
                {
                    Registry.LocalMachine.DeleteSubKeyTree(companyPath);
                }

                NativeMethods.SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);
                return(true);
            }

            return(false);
        }
        public static bool Register(Software target)
        {
            // Software 등록
            var softwarePath = $@"Software\{target.CompanyName}\{target.Name}\Capabilities";

            if (Registry.LocalMachine.OpenSubKey(softwarePath) == null)
            {
                var softwareKey = Registry.LocalMachine.CreateSubKey(softwarePath);
                softwareKey.SetValue(RegistryKeys.ApplicationName, target.Name);
                softwareKey.SetValue(RegistryKeys.ApplicationIcon, target.Icon);
                softwareKey.SetValue(RegistryKeys.ApplicationDescription, target.Description);

                var registeredKey = Registry.LocalMachine.OpenSubKey(@"Software\RegisteredApplications", true);
                if (registeredKey != null)
                {
                    registeredKey.SetValue(target.Name, softwarePath);
                }

                // Prog ID 등록
                var associationsKey = softwareKey.CreateSubKey("FileAssociations");
                foreach (var prog in target.Identifiers)
                {
                    var extName = prog.Type.Extension.Replace(".", "").ToUpper();
                    var keyID   = $"{target.Name}.AssocFile.{extName}";

                    // Prog ID 생성
                    ProgIDUtility.CreateProgID(keyID, prog);

                    // Prog ID 연결
                    associationsKey.SetValue(prog.Type.Extension, keyID);
                }

                NativeMethods.SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);
                return(true);
            }

            return(false);
        }