— простой проект VSTO .NET Framework 4.8.1. (В настоящее время он работает хорошо.)
- Простой проект ExcelDna, который добавляет в Excel некоторые дополнительные служебные функции, такие как SumByStyle. Он создал 32-битные и 64-битные файлы package.xll, и я убедился, что эти файлы перемещены по правильному пути, который Excel может прочитать, и все они работают правильно (если я добавляю их вручную в Excel).
- проект Installer-SetupProject (Microsoft Visual Studio Installer Projects 2022, последняя версия 3.0.0) для их упаковки.
Для динамической записи в реестр для AutoLoad xll в Excel, не требуя каких-либо дополнительных действий пользователя после установки (с использованием VSTO и ExcelDna), я добавил проект C# ClassLibrary. Я реализовал код, унаследованный от Installer, и переопределил как Installer, так и Uninstaller. Затем я назначил их CustomAction проекта установки. Некоторые регистрационные коды реестра следующие:
Код: Выделить всё
public void RegisterOfficeExcelExtension()
{
WriteLog("Start RegisterOfficeExcelExtension");
LogCurrentContext();
using (RegistryKey officeRoot = Registry.CurrentUser.OpenSubKey(@"Software\\Microsoft\\Office", writable: true))
{
if (officeRoot == null)
{
WriteLog("Not found Office in HKCU");
return;
}
foreach (string version in officeRoot.GetSubKeyNames())
{
if (!Regex.IsMatch(version, @"^\d+(\.\d+)?$")) continue;
using (RegistryKey versionKey = officeRoot.OpenSubKey(version, writable: true))
{
if (versionKey == null) continue;
using (RegistryKey excelOptions = versionKey.CreateSubKey(@"Excel\\Options"))
{
if (excelOptions == null) continue;
var existingValues = new HashSet(StringComparer.OrdinalIgnoreCase);
foreach (string valueName in excelOptions.GetValueNames())
{
existingValues.Add(valueName);
}
int index = 0;
foreach (string file in fullFilePathExt)
{
bool alreadyRegistered = false;
foreach (string valueName in excelOptions.GetValueNames())
{
string strValue = excelOptions.GetValue(valueName)?.ToString()?.Trim('"');
if (string.Equals(strValue, file, StringComparison.OrdinalIgnoreCase))
{
alreadyRegistered = true;
WriteLog($"File: {file} Key: {valueName}");
break;
}
}
if (!alreadyRegistered)
{
string newKeyName;
do
{
newKeyName = index == 0 ? "OPEN" : $"OPEN{index}";
index++;
} while (existingValues.Contains(newKeyName));
excelOptions.SetValue(newKeyName, file, RegistryValueKind.String);
existingValues.Add(newKeyName);
string regPath = $@"HKCU\\Software\\Microsoft\\Office\\{version}\\Excel\\Options";
WriteLog($"KeyCreated: '{newKeyName}' Value: '{file}' At: {regPath}");
}
}
}
}
}
}
WriteLog("End RegisterOfficeExcelExtension");
}
В частности, я напишу реестр в HKCU (Computer\HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Excel\Options). Создайте новый строковый ключ с именем ключа = OPEN, и значением будет точный абсолютный путь к файлам package.xll.
Да, они прекрасно работают без каких-либо ошибок.
Но когда я запускаю -> Выполнить -> regedit -> Введите и проверьте ключи по адресу: Computer\HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Excel\Options, это не так. пишется. Я также проверил свой файл журнала, и все ключи были успешно записаны.
Поэтому я проверил Computer\HKEY_USERS\S-1-5-18\Software\Microsoft\Office\16.0\Excel\Options и, как ни странно, все ключи были записаны там. Поскольку установщик Microsoft MSI, похоже, работает в другом контексте, чем HKCU, он не может писать в HKCU.
Я боролся, искал, искал, спрашивал AI и пробовал все доступные сегодня продвинутые технологии, но все безрезультатно. Я также рассмотрел другие решения для установки, но они либо устарели (например, WiX v3), больше не поддерживаются, либо требуют оплаты. Поэтому, если у вас есть опыт или лучшее решение, пожалуйста, просветите меня.