DOBON.NET DOBON.NETプログラミング掲示板過去ログ

misファイルのバージョン取得方法

環境/言語:[Xp C# Framework3.5]
分類:[.NET]

お世話になります。
VS2008で作成したmsiファイルのバージョンを所定の場所に置き、
C#のプログラムから取得したいのですが、
msiのバージョンを取得するにはどのようにしたらいいのでしょうか?
FileInfoなどはexeのバージョンは取れるのですが、msiのバージョンが取れません
(エラーにはなりませんが、空欄が返ってきます)

検索してみましたがなかできなかったのですが。。。
よろしくお願いいたします。
http://stackoverflow.com/questions/815744/retrieving-version-of-an-msi-file-built-with-wix
MsiGetProductProperty などの Win32API を使って取得する方法と、WindowsInstaller.Installer COM オブジェクトを使って取得する方法が紹介されてますね。
後者の方は Microsoft Windows Installer Object Library(msi.dll)を COM 参照すれば楽に使えるかな。
ありがとうございます。
下記URLを参照してやってみようと以下のようにしてみたのですが、

[System.Runtime.InteropServices.ComImport, System.Runtime.InteropServices.Guid("000C1090-0000-0000-C000-000000000046")]
class WindowsInstallerCoclass
{
};

private void button1_click(object sender, EventArgs e)
{
WindowsInstaller.Installer inst = (WindowsInstaller.Installer)new WindowsInstallerCoclass();
???? database = inst.OpenDatabase("XXXXXX.msi", 0);
View view = database.OpenView("SELECT Value FROM Property WHERE Property='ProductVersion'");
view.Execute(null);
result = view.Fetch();
result.StringData(1);

}

???のところは何を指定するのか、名前空間は何を追加するのか、
rsultの型はなにを設定するか・・・など情けないけれど分かりません。
COM参照でMSIは追加しています
見当違いのことをしていますでしょうか。。。。

■No26745に返信(Hongliangさんの記事)
> http://stackoverflow.com/questions/815744/retrieving-version-of-an-msi-file-built-with-wix
> MsiGetProductProperty などの Win32API を使って取得する方法と、WindowsInstaller.Installer COM オブジェクトを使って取得する方法が紹介されてますね。
> 後者の方は Microsoft Windows Installer Object Library(msi.dll)を COM 参照すれば楽に使えるかな。
> WindowsInstaller.Installer inst = (WindowsInstaller.Installer)new WindowsInstallerCoclass();
> ???? database = inst.OpenDatabase("XXXXXX.msi", 0);
> ???のところは何を指定するのか
OpenDatabase にカーソルをあてれば返値の型もインテリセンスに出ると思いますが。WindowsInstaller.Database 型です。

> 名前空間は何を追加するのか
するなら WindowsInstaller 名前空間でしょう。もっともわざわざ using するほどもないかも。var 使っちゃうと一層。
ソリューションエクスプローラの参照に入っている WindowsInstaller を右クリックしてオブジェクトブラウザで見てみれば、どんな名前空間下にどんな型が定義されているか確認できます。
// しかし coclass は msi.dll 内では未定義だったのか。
ちなみに、coclass はお書きになったような手段の他、ProgId(今回の場合は WindowsInstaller.Installer)が存在しているなら Type.GetTypeFromProgId で型を取得し、Activator.CreateInstance でインスタンス化する(その後目的のインターフェイス、今回なら WindowsInstaller.Installer にキャストする)といったこともできます。

> rsultの型はなにを設定するか
OpenDatabase と同様にインテリセンスで確認してみて下さい。
ありがとうございます
やってみます


■No26751に返信(Hongliangさんの記事)
>> WindowsInstaller.Installer inst = (WindowsInstaller.Installer)new WindowsInstallerCoclass();
>> ???? database = inst.OpenDatabase("XXXXXX.msi", 0);
>>???のところは何を指定するのか
> OpenDatabase にカーソルをあてれば返値の型もインテリセンスに出ると思いますが。WindowsInstaller.Database 型です。
>
>>名前空間は何を追加するのか
> するなら WindowsInstaller 名前空間でしょう。もっともわざわざ using するほどもないかも。var 使っちゃうと一層。
> ソリューションエクスプローラの参照に入っている WindowsInstaller を右クリックしてオブジェクトブラウザで見てみれば、どんな名前空間下にどんな型が定義されているか確認できます。
> // しかし coclass は msi.dll 内では未定義だったのか。
> ちなみに、coclass はお書きになったような手段の他、ProgId(今回の場合は WindowsInstaller.Installer)が存在しているなら Type.GetTypeFromProgId で型を取得し、Activator.CreateInstance でインスタンス化する(その後目的のインターフェイス、今回なら WindowsInstaller.Installer にキャストする)といったこともできます。
>
>>rsultの型はなにを設定するか
> OpenDatabase と同様にインテリセンスで確認してみて下さい。
ありがとうございました!
無事、取得できました


■No26752に返信(キャンディさんの記事)
> ありがとうございます
> やってみます
>
>
> ■No26751に返信(Hongliangさんの記事)
> >> WindowsInstaller.Installer inst = (WindowsInstaller.Installer)new WindowsInstallerCoclass();
> >> ???? database = inst.OpenDatabase("XXXXXX.msi", 0);
> >>???のところは何を指定するのか
>>OpenDatabase にカーソルをあてれば返値の型もインテリセンスに出ると思いますが。WindowsInstaller.Database 型です。
>>
> >>名前空間は何を追加するのか
>>するなら WindowsInstaller 名前空間でしょう。もっともわざわざ using するほどもないかも。var 使っちゃうと一層。
>>ソリューションエクスプローラの参照に入っている WindowsInstaller を右クリックしてオブジェクトブラウザで見てみれば、どんな名前空間下にどんな型が定義されているか確認できます。
>>// しかし coclass は msi.dll 内では未定義だったのか。
>>ちなみに、coclass はお書きになったような手段の他、ProgId(今回の場合は WindowsInstaller.Installer)が存在しているなら Type.GetTypeFromProgId で型を取得し、Activator.CreateInstance でインスタンス化する(その後目的のインターフェイス、今回なら WindowsInstaller.Installer にキャストする)といったこともできます。
>>
> >>rsultの型はなにを設定するか
>>OpenDatabase と同様にインテリセンスで確認してみて下さい。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板