9

System.Diagnostic.Process.Start() を実行して別の Html2xhtml.exe を呼び出すライブラリ Html2Xhtml.dll (.NET) を使用する VSTO Outlook アドインを作成しました。

ただし、Visual Studio から起動した場合でも作業ディレクトリが現在のユーザーの My Documents フォルダーであるため、Html2xhtml.exe の呼び出しに失敗します (私はそう思います)。Html2Xhtml.dll のコードを制御できないため、絶対パスを使用できません。しかし、実行時にアドインの作業ディレクトリを変更できると思います。

ただし、ClickOnce またはユーザーが選択するインストール パスがわからないその他の方法でこれをインストールした場合、Html2xhtml.exe を見つけるにはどうすればよいでしょうか?

4

5 に答える 5

25

ここで答えを見つけました。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());
于 2012-05-23T04:28:50.853 に答える
3

私は同様の問題を抱えており、クリストフが説明したのと同じ方法で解決しました。これを行う別の方法があるかどうかも知りたいのですが、何も見つからない場合はここに例があります

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)セットアッププロジェクトで、インストールディレクトリを指すカスタムインストールアクションのキーを作成します。 カスタムアクションをインストールする

詳細情報が必要な場合、またはソースをダウンロードしたい場合は、Open Xml MVP WouterVanWugtによる「Windowsインストーラーを使用したOfficeソリューション用のVisualStudio2010ツールの展開」というタイトルのmsdn投稿を参照してください。

于 2012-03-28T06:59:12.270 に答える
2

それは私がかなり長い間戦わなければならなかった本当の問題です. 私が使用しなければならなかったアドインで使用された解決策は、インストール ディレクトリをレジストリに書き込み、そこから値を読み取ることでした。そうすれば、exe に埋め込むことができなかったものを見つけることができます。これは良い解決策ではありませんが、うまくいきました。

MS が DLL をランダムなディレクトリにコピーするという愚かな「セキュリティ メカニズム」に固執する理由は、おそらく決して明かされない秘密です。

コメントを書いているときに、これまで試したことのないアイデアが実際にありました。インストーラーに、後で必要なファイルを %appdir%\YourCompany\YourApplication\libs などにコピーさせます。実行時に自分のものを見つけることができるはずです。

于 2012-03-27T09:47:47.113 に答える
1

ClickOnce アプリケーションにも同じ問題がありました。アドインの展開パスを取得するために必要なことは次のとおりです。

アプリケーションに System.Deployment.Application 参照を追加します

次に、このプロパティを使用してデプロイ パスを取得します。

ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString()

そして、そこに行きます!

于 2012-11-21T05:32:05.413 に答える