Найдите каталог установки и рабочий каталог VSTO Outlook Addin; или любой Office Addin
Я создал VSTO Outlook Addin, который использует библиотеку Html2Xhtml.dll (.NET), которая вызывает другой Html2xhtml.exe путем выполнения системы.Диагностический.Процесс.Начать.)(
однако он не может вызвать Html2xhtml.exe (я думаю), потому что рабочий каталог даже при запуске из Visual Studio является текущим пользователем папки "Мои Документы". У меня нет контроля над кодом в Html2Xhtml.dll, поэтому я не могу использовать абсолютный путь; но я полагаю, что могу изменить рабочий каталог надстройки на во время выполнения.
однако, если я устанавливаю это через ClickOnce или какие-либо другие средства, где я не знаю путь установки, который пользователь собирается выбрать, как я должен найти свой Html2xhtml.exe?
4 ответов
Я нашел ответ!--2-->здесь, полные кредиты 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.0\Common", true);
RegistryKey acturisKey = key.CreateSubKey(@"Spotlight\MyAppInstallPath");
acturisKey.SetValue("InstallPath", installPath);h);
}
}
}
2)в проекте установки создайте ключ на пользовательском действии установки, который указывает на каталог установки:
Если вам нужна дополнительная информация или вы хотели бы чтобы загрузить источник, посмотрите на этой сообщение msdn от Open Xml MVP Wouter Van Wugt под названием "развертывание Visual Studio 2010 Tools for Office Solution с помощью установщика Windows"
Это реальная проблема, с которой мне пришлось бороться в течение некоторого времени. Решение, используемое в Аддине, с которым мне пришлось работать, состояло в том, чтобы записать каталог установки в реестр и прочитать значение оттуда. Таким образом, можно было найти вещи, которые не могли быть встроены в exe. Это не очень хорошее решение, но оно сработало.
Почему MS придерживается этого глупого "механизма безопасности" копирования DLL в случайный каталог-это секрет, который они, вероятно, никогда не будут открывать.
при написании моего комментария у меня на самом деле была идея, которую я до сих пор не пробовал: сделайте свой установщик копией файлов, которые вам нужны позже, в %appdir%\YourCompany\YourApplication\libs или некоторые такие. Вы должны быть в состоянии найти свои вещи, то во время выполнения.
была та же проблема для приложений ClickOnce. Вот что вам нужно сделать, чтобы получить путь развертывания addin:
Добавить Системы.Развертывание.Ссылка на приложение в вашем приложении
далее следует использовать это свойство для извлечения пути развертывания:
ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString()
и там вы идете!