Registry.LocalMachine.OpenSubKey () возвращает результат, отличный от редактора реестра - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь создать установщик для моего плагина САПР, и мне нужно получить место установки AutoCAD.но возвращаемые значения RegistryKey.GetSubKeyNames() отличаются от того, что я вижу в редакторе реестра.

string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
    foreach (string subkey_name in key.GetSubKeyNames())
    {
        Console.WriteLine(subkey_name);
    }
}

вывод:

AddressBook
Autodesk Application Manager
Autodesk ContentСервис
Библиотека материалов Autodesk 2015
База изображений библиотеки материалов Autodesk Библиотека изображений 2015
Диспетчер соединений
DirectDrawEx
DXM_Runtime
f528b707
Fontcore
...

В редакторе реестра:

animizvideocn_is1
AutoCAD 2015
Autodesk 360
Диспетчер подключений
...

AutoCAD 2015 это то, что мне нужно

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Это может быть не прямой ответ на ваш вопрос, но я должен был сделать то же самое.Я смотрел не в реестре, а в каталоге Program Files.Затем он добавит команду netload в файл lisp автозагрузки.Он установит список библиотек плагинов для всех установленных версий AutoCAD.Это можно легко изменить ... Надеюсь, это поможет.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;

namespace AMU.AutoCAD.Update
{
  public class AutoCadPluginInstaller
  {
    private static readonly Regex AutoloadFilenameRegex = new Regex("acad([\\d])*.lsp");

    public void Install(IEnumerable<string> pluginFiles)
    {
      var acadDirs = this.GetAcadInstallationPaths();
      var autoloadFiles = acadDirs.Select(this.GetAutoloadFile);

      foreach (var autoloadFile in autoloadFiles)
        this.InstallIntoAutoloadFile(autoloadFile, pluginFiles);
    }

    private void InstallIntoAutoloadFile(string autoloadFile, IEnumerable<string> pluginFiles)
    {
      try
      {
        var content = File.ReadAllLines(autoloadFile).ToList();
        foreach (var pluginFile in pluginFiles)
        {
          var loadLine = this.BuildLoadLine(pluginFile);
          if(!content.Contains(loadLine))
            content.Add(loadLine);
        }

        File.WriteAllLines(autoloadFile, content);
      }
      catch (Exception ex)
      {
        //log.Log();
      }
    }

    private string BuildLoadLine(string pluginFile)
    {
      pluginFile = pluginFile.Replace(@"\", "/");
      return $"(command \"_netload\" \"{pluginFile}\")";
    }

    private IEnumerable<string> GetAcadInstallationPaths()
    {
      var programDirs =
        Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);

      var autoDeskDir = Path.Combine(programDirs, "Autodesk");
      if (!Directory.Exists(autoDeskDir))
        return null;

      return Directory.EnumerateDirectories(autoDeskDir)
                             .Where(d => d.Contains("AutoCAD"));
    }

    private string GetAutoloadFile(string acadDir)
    {
      var supportDir = Path.Combine(acadDir, "Support");
      var supportFiles = Directory.EnumerateFiles(supportDir);
      return supportFiles.FirstOrDefault(this.IsSupportFile);
    }

    private bool IsSupportFile(string path)
      => AutoloadFilenameRegex.IsMatch(Path.GetFileName(path));
  }
}

(см. Здесь: https://gist.github.com/felixalmesberger/4ff8ed27f66f872face4368a13123fff)

Вы можете использовать его следующим образом:

var installer = new AutoCadPluginInstaller();
installer.Install(new [] {"Path to dll"});

Веселитесь.

0 голосов
/ 30 мая 2019

Ваш установщик выглядит как 32-битное приложение или, по крайней мере, работает как 32-битный процесс.

Следовательно, Windows перенаправляет

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

до

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall

Чтобы получить доступ к не перенаправленному узлу, следуйте инструкциям здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...