Найти каталог установки и рабочий каталог VSTO Outlook Addin; или любой Office Addin - PullRequest
7 голосов
/ 27 марта 2012

Я создал VSTO Outlook Addin, который использует библиотеку Html2Xhtml.dll (.NET), которая вызывает другой Html2xhtml.exe, выполнив System.Diagnostic.Process.Start ().

Однако он не может вызвать Html2xhtml.exe (я думаю), поскольку рабочий каталог, даже когда он запускается из Visual Studio, является папкой «Мои документы» текущего пользователя. У меня нет контроля над кодом в Html2Xhtml.dll, поэтому я не могу использовать абсолютный путь; но я полагаю, что я могу изменить рабочий каталог надстройки во время выполнения.

Однако, если я установлю это через ClickOnce или каким-либо другим способом, если я не знаю путь установки, который выберет пользователь, как мне найти мой Html2xhtml.exe?

Ответы [ 5 ]

19 голосов
/ 23 мая 2012

Я нашел ответ здесь , полные кредиты для 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());
3 голосов
/ 28 марта 2012

У меня была похожая проблема, и я решил ее так же, как описано Кристофом, я также хотел бы знать, есть ли альтернативные способы сделать это, но если вы ничего не найдете, вот пример

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, который указывает на каталог установки: Install custom action

Если вам нужна дополнительная информация или вы хотите загрузить исходный код, просмотрите эту статью MSDN Open Xml MVP Wouter Van Wugt под названием «Развертывание средств Visual Studio 2010 для Office Solution с помощью установщика Windows»

1 голос
/ 27 марта 2012

Это реальная проблема, с которой мне пришлось бороться в течение достаточно долгого времени.Решение, использованное в надстройке, с которой мне приходилось работать, заключалось в том, чтобы записать установочный каталог в реестр и прочитать значение оттуда.Таким образом, можно найти вещи, которые не могут быть встроены в exe.Это не очень хорошее решение, но оно сработало.

Почему MS придерживается этого глупого «механизма безопасности» копирования DLL в случайный каталог - секрет, который они, вероятно, никогда не раскроют.

ХотяНаписание своего комментария У меня действительно была идея, которую я до сих пор не пробовал: Заставьте ваш установщик скопировать нужные вам файлы позже в% appdir% \ YourCompany \ YourApplication \ libs или что-то подобное.Тогда вы сможете найти свои вещи во время выполнения.

0 голосов
/ 19 июля 2019

Для плагинов COM System.Reflection.Assembly.Location не обеспечивает стабильную доставку того, что нам нужно.

Но даже если возможно сохранить каталог установки в реестре, это не обязательно. Так как: Плагин COM обычно имеет идентификатор. Вы можете определить его с помощью GuidAttribute. Во время установки / регистрации вашего плагина информация об этой сборке хранится в:

Computer\HKEY_CLASSES_ROOT\CLSID\{...myPlugin id ....}\InprocServer32

в атрибуте "Codebase" вы найдете путь к вашему файлу.

e.g.: file:///C:/Program Files/myPlugin.dll
0 голосов
/ 21 ноября 2012

Была такая же проблема для приложений ClickOnce. Вот что вам нужно сделать, чтобы получить путь развертывания надстройки:

Добавьте ссылку System.Deployment.Application в свое приложение

Далее следует использовать это свойство для получения пути развертывания:

ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString()

и вот, пожалуйста!

...