Найти каталог установки и рабочий каталог VSTO Outlook Addin; или любой Office Addin
Я создал VSTO Outlook Addin, который использует библиотеку Html2Xhtml.dll (.NET), которая вызывает другой Html2xhtml.exe, выполнив System.Diagnostic.Process.Start().
Тем не менее, он не может вызвать Html2xhtml.exe (я думаю), потому что рабочим каталогом, даже если он запущен из Visual Studio, является папка "Мои документы" текущего пользователя. У меня нет контроля над кодом в Html2Xhtml.dll, поэтому я не могу использовать абсолютный путь; но я полагаю, что могу изменить рабочий каталог надстройки во время выполнения.
Однако, если я установлю это через ClickOnce или каким-либо другим способом, где я не знаю путь установки, который выберет пользователь, как мне найти мой Html2xhtml.exe?
4 ответа
Я нашел ответ здесь, полный кредит на robindotnet.wordpress.com.
//Get the assembly information
System.Reflection.Assembly assemblyInfo = System.Reflection.Assembly.GetExecutingAssembly();
//Location is where the assembly is run from
string assemblyLocation = assemblyInfo.Location;
//CodeBase is the location of the ClickOnce deployment files
Uri uriCodeBase = new Uri(assemblyInfo.CodeBase);
string ClickOnceLocation = Path.GetDirectoryName(uriCodeBase.LocalPath.ToString());
У меня была похожая проблема, и я решил ее так же, как описано Кристофом, я также хотел бы знать, есть ли альтернативные способы сделать это, но если вы ничего не нашли, вот пример
1) Создайте библиотеку пользовательских действий со следующим InstallerClass
using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using Microsoft.VisualStudio.Tools.Applications;
using Microsoft.Win32;
namespace Setup.CustomActions
{
[RunInstaller(true)]
public partial class AddCustomization : Installer
{
static readonly Guid solutionID = new Guid("d6680661-c31e-4c24-9492-5919dc0uagt5");
public override void Install(IDictionary stateSaver)
{
string installPath = Context.Parameters["installPath"];
if(!String.IsNullOrEmpty(installPath))
{
AddTemplateToAvailableTemplates(installPath);
}
base.Install(stateSaver);
}
public override void Rollback(IDictionary savedState)
{
}
public override void Uninstall(IDictionary savedState)
{
}
private void AddTemplateToAvailableTemplates(string installPath)
{
//The example below is very basic, put in checks to see whether the registry key already exists and so on
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Office\14.0\Common", true);
RegistryKey acturisKey = key.CreateSubKey(@"Spotlight\MyAppInstallPath");
acturisKey.SetValue("InstallPath", installPath);h);
}
}
}
2) В проекте установки создайте ключ в пользовательском действии Install, который указывает на каталог установки:
Если вам нужна дополнительная информация или вы хотите загрузить исходный код, ознакомьтесь с этой статьей msdn от Open Xml MVP Wouter Van Wugt под названием "Развертывание средств Visual Studio 2010 для решения Office с помощью установщика Windows".
Это реальная проблема, с которой мне пришлось бороться в течение достаточно долгого времени. Решение, используемое в надстройке, с которой мне приходилось работать, заключалось в том, чтобы записать установочный каталог в реестр и прочитать значение оттуда. Таким образом, можно найти вещи, которые не могут быть встроены в exe. Это не хорошее решение, но оно сработало.
Почему MS придерживается этого глупого "механизма безопасности" копирования DLL в случайный каталог - секрет, который они, вероятно, никогда не раскроют.
Во время написания моего комментария у меня действительно была идея, которую я до сих пор не попробовал: заставить ваш установщик скопировать нужные вам файлы позже в%appdir%\YourCompany\YourApplication\libs или что-то подобное. Вы должны быть в состоянии найти свои вещи тогда во время выполнения.
Была такая же проблема для приложений ClickOnce. Вот что вам нужно сделать, чтобы получить путь развертывания надстройки:
Добавьте ссылку System.Deployment.Application в свое приложение
Далее следует использовать это свойство для получения пути развертывания:
ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString()
и там вы идете!
Для подключаемых модулей COM System.Reflection.Assembly.Location не всегда обеспечивает то, что нам нужно.
Но даже если можно каким-либо образом сохранить каталог установки в реестре, это не обязательно. Потому что: плагин COM обычно имеет идентификатор. Вы можете определить его с помощью GuidAttribute. Во время установки / регистрации вашего плагина информация об этой сборке сохраняется в:
Computer\HKEY_CLASSES_ROOT\CLSID\{...myPlugin id ....}\InprocServer32
в атрибуте "Кодовая база" вы найдете путь к вашему файлу.
e.g.: file:///C:/Program Files/myPlugin.dll