2014-01-06 6 views
8

既存のアプリケーション用のプラグイン(実際にはプラグインを生成するビジュアルスタジオテンプレートウィザード)を作成しようとしています。プラグインのインストールの一環として、設定データベースにエントリを挿入する必要があります。多くの場合、機能のさまざまな部分に対応する複数のDLLが存在し、それぞれが同じテーブル内のエントリを必要とすることもありますが、通常はテーブルエントリの異なる組み合わせがあります。私はインストーラからそれらを追加する必要があります。Microsoft WindowsインストーラクラスからインストールされたDLLのリストを取得する

ポリシー上の理由から、すべてがC#にあります。

私は現在Visual Studio Installer(VS2010)を使用してインストーラを作成しています。私はテンプレート/ウィザードのインストールを単純に保つためにユーザのマシンにインストールされる可能性のあるものを使用したいが、オープンソース(あるいは少なくとも自由に再配布可能な)の代替インストーラ。

たとえば、アプリケーションにメニューエントリを追加するには、いくつかのテーブルにエントリを挿入する必要があります。以前は、インストーラアプリケーションから呼び出されたインストーラヘルパ(時にはアプリケーション、時にはinstaller class)を使用してこれを行ってきました。その設計では、設定テーブルに追加する必要がある設定をインストーラヘルパーに埋め込み、SQLを(C#:-)経由で実行して実際に追加を行います。

これは、同じ情報を2つの場所に繰り返すことにつながり、ウィザード環境ではそれほどメンテナンスやクリーンではありません。私は本当にプラグインアセンブリで設定できるいくつかの属性からこの情報をイントロスペクトする方が好きです。

しかし私は最初のステップを偶然見つけました。私のインストーラクラスは、このインストールでどのアセンブリがインストールされたか(またはインストールされるか)をどのように見つけることができますか?

DLLのリストをカスタムインストーラプロパティに埋め込むことを検討しましたが、これもプラグインウィザードから生成するのが難しいでしょう。理想的には、私が登録できる既存のイベント、または私が読むことができる既存のイベントがありますが、私はそれをまだ発見していません。

+0

ですから、.MSIファイルとそれが含まれてどのようなDLLを決定するがありますか? –

+0

私はインストーラプロジェクトを持っています(その出力は.msiです)。インストーラクラスは、その.msi(DLLに含まれるDLLと選択された構成)またはDLLがインストールしたDLLで動作するはずです。 – BradHards

答えて

2

ウィザードの実行と.msiの表示の間に何が起こるかはっきりしません。 (ウィザードの出力はVSプロジェクトか.msi自体です(この場合、エンドユーザーはVSを必要としません)?)しかし、始めよう...

あなたのボトルネックのようですVisual Studioインストーラです。それはVS2010で死ぬこともあるので、それは時限爆弾です。多くのプロジェクト(Visual Studioなど)では、代わりにWiX Toolsetを使用します。 Visual StudioとSharpDevelopユーザーの場合、WiXは「ユーザーのマシンにインストールされる可能性があります」、「オープンソース」です。これは、ウィザードに含めることができるバイナリとして利用できます。または、NuGet、Chocolatey、またはexeの完全な製品(VS拡張子を含む)をユーザーがインストールすることも、インストールすることもできます。

WiXでは、Windowsインストーラパッケージの内容、UI、および動作シーケンスを記述するXMLファイルを作成または生成します。実際のビルドを行うためにWiX実行可能ファイルが呼び出されます。 WiXのMSBuildファイルをインストールする場合は、MSBuildプロジェクトを使用してビルドを編成できます。 WiXのVSエクステンションをインストールする場合、VSを使ってプロジェクトを編集できます。 (現代のVSプロジェクトはMSBuildプロジェクトです。)MSBuildには.NETが付属しています(次のバージョンまでは別のアドオンになります)。

したがって、ウィザードは、ユーザー入力とプラグインのデータに基づいてWiX用のファイルを生成できます。 MSIを構築することもできます。インストールヘルパーは引き続き使用できますが、アンインストールとアップグレードを確実にサポートするには、WiXのSQL Serverカスタムアクション(ケースに該当する場合)を使用する方がよいでしょう。

プラグインのインストールと設定のデータの少なくとも一部がプラグインからのものであるため、プラグインプロジェクトで生成されるので、ウィザードでインストールすることができます。 WiXは別々のコンポーネントの情報を別々のファイルに配置することをサポートしているため、ウィザード用の結合ファイルを維持する必要はありません。情報が単純な場合、プラグインの作者は手動で情報を維持することができます。それ以外の場合は、プラグイン編集時またはプラグイン構築時に生成されます。編集時には、T4テンプレート(C#コードと混在したコンテンツ)を使用することができます。ビルド時には、インラインまたはコンパイルされたカスタムMSBuildタスク(C#で書かれています)を使用することができます。 [.csprojファイルはMSBuildプロジェクトです。]またウィザードインストーラは、ウィザードが実行されるマシンにインストールするプラグインDLLとともに、生成されたファイルを取得します。

WiXを使用してウィザードをインストールすることもできます。ウィザードがVSIXパッケージの場合は、WiXのVSIXカスタムアクションを使用します。あなたはおそらく、ウィザードのインストーラとそのユーザ用に生成されたインストーラの両方のプラグインにWixファイルを使用することができます。

+0

WiXツールキットの提案に感謝します。私はおそらくウィザードのアイデアを説明していないかもしれませんが、質問を更新する前に、ウィザードはVSプロジェクトのセットを作成(または更新)します。その1つはインストールヘルパーで、その1つはインストーラです1つまたは複数の「ペイロード」プラグインDLLがあります。 – BradHards

+0

さて、あなたのウィザードはソリューションにWiXセットアッププロジェクトを追加/維持することができます。 Visual Studioインストーラプロジェクトを維持するよりもはるかに簡単です。 –

3

Windows Installer APIを使用して、特定のMSIパッケージに含まれているすべてのDLLをダンプすることができます。

C#には、これを行うためのさまざまなライブラリまたはサンプルコードが用意されています。

ここでは、オープンソースのWix toolsetプロジェクトのDLLを使用します。だから、あなただけのバイナリ(ではないのWiXインストーラ)をダウンロードする必要があり、プロジェクトを作成し、この中でMicrosoft.Deployment.WindowsInstaller.dllMicrosoft.Deployment.WindowsInstaller.Package.dlリットルへの参照を追加ここでは、ディレクトリ

から、バイナリパッケージのすべてのDLLファイルの一部を書き出すサンプルプログラムです。

class Program 
{ 
    static void Main(string[] args) 
    { 
     string path = @"... myfile.msi"; 
     using (InstallPackage package = new InstallPackage(path, DatabaseOpenMode.ReadOnly)) 
     { 
      foreach (var kvp in package.Files.Where(f => Path.GetExtension(f.Value.TargetName) == ".dll")) 
      { 
       Console.WriteLine(kvp.Value.TargetName); 
      } 
     } 
    } 
} 

}

+0

ありがとうございます。 InstallerクラスにどのMSIが呼び出されているかを伝える方法はありますか?つまり、@ "... myfile.msi"部分をハードコーディングしないようにするためです。 – BradHards

+0

これをチェックしてください:http://stackoverflow.com/questions/17390867/how-to-get-the-path-where-msi-is-being-installed-within-installer-class –

+0

@SimonMourier:http: MSIパスをインストーラに渡すためのメカニズムについては、/stackoverflow.com/questions/368154/i-require-a-msi-custom-action-that-c​​opies-a-file-from-the-msi-source-directoryを参照してください。 –

関連する問題