查找VSTO Outlook Addin的安装目录和工作目录;或任何Office Addin

时间:2012-03-27 09:40:06

标签: outlook vsto clickonce working-directory

我创建了一个使用库Html2Xhtml.dll(.NET)的VSTO Outlook Addin,它通过执行System.Diagnostic.Process.Start()来调用另一个Html2xhtml.exe。

然而,它无法调用Html2xhtml.exe(我认为)因为即使从Visual Studio启动工作目录也是当前用户的My Documents文件夹。我无法控制Html2Xhtml.dll中的代码,所以我不能使用绝对路径;但我想我可以在运行时更改外接程序的工作目录。

但是,如果我通过ClickOnce或其他一些我不知道用户将要选择的安装路径的方式安装它,我怎么想找到我的Html2xhtml.exe?

5 个答案:

答案 0 :(得分:19)

我找到了答案here,完全归功于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 :(得分:3)

我遇到了类似的问题,并以与Christoph所描述的相同的方式解决了它,我也想知道是否有其他方法可以做到这一点,但如果你没有找到任何东西,这是一个例子

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 custom action上创建一个指向安装目录的键: Install custom action

如果您需要更多信息或想下载源代码,请查看Open Xml MVP Wouter Van Wugt撰写的this msdn帖子,标题为“使用Windows Installer为Office解决方案部署Visual Studio 2010工具”

答案 2 :(得分:1)

这是一个我必须与之斗争很长一段时间的真正问题。我不得不使用的AddIn中使用的解决方案是将安装目录写入注册表并从那里读取值。这样就可以找到无法嵌入到exe中的东西。这不是一个好的解决方案,但它有效。

为什么MS坚持这种将DLL复制到随机目录的愚蠢“安全机制”是他们可能永远不会透露的秘密。

在撰写我的评论时,我实际上有一个想法,到目前为止我没有尝试:让安装程序将以后需要的文件复制到%appdir%\ YourCompany \ YourApplication \ libs或其他一些。你应该能够在运行时找到你的东西。

答案 3 :(得分:0)

ClickOnce应用程序存在同样的问题。以下是获取插件的部署路径所需执行的操作:

在您的应用程序中添加System.Deployment.Application引用

接下来是使用此属性来检索部署路径:

ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString()

然后你去!

答案 4 :(得分:0)

对于COM插件,System.Reflection.Assembly.Location无法稳定提供我们所需的内容。

但是,即使可以将安装目录保存在注册表中,也没有必要。因为: COM插件通常具有一个ID。您可以使用GuidAttribute定义它。 在安装/注册插件期间,有关此程序集的信息存储在以下位置:

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

在“代码库”属性中,找到文件的路径。

e.g.: file:///C:/Program Files/myPlugin.dll