我创建了一个使用库Html2Xhtml.dll(.NET)的VSTO Outlook Addin,它通过执行System.Diagnostic.Process.Start()来调用另一个Html2xhtml.exe。
然而,它无法调用Html2xhtml.exe(我认为)因为即使从Visual Studio启动工作目录也是当前用户的My Documents文件夹。我无法控制Html2Xhtml.dll中的代码,所以我不能使用绝对路径;但我想我可以在运行时更改外接程序的工作目录。
但是,如果我通过ClickOnce或其他一些我不知道用户将要选择的安装路径的方式安装它,我怎么想找到我的Html2xhtml.exe?
答案 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上创建一个指向安装目录的键:
如果您需要更多信息或想下载源代码,请查看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