• 追加された行はこの色です。
  • 削除された行はこの色です。
#title(.NETプログラミング研究 第61号)

#navi(.NET プログラミング研究)
#navi(.NETプログラミング研究)

#contents

*.NETプログラミング研究 第61号 [#md001445]

**.NET Tips [#x966fd09]

今回はVS.NETのデプロイメントプロジェクトに関する過去の記事の補足をさせていただきます。

***Orcaの入手法 [#ib42e84a]

#column(注意){{
この記事の最新版は「[[Orcaの入手法>http://dobon.net/vb/dotnet/deployment/orca.html]]」で公開しています。
}}

いまさらですが、今まで嫌というほど登場したOrcaを入手する方法を紹介しておきます。

残念ながらOrcaは単体では配布されていません。OrcaはPlatform SDKに含まれていますので、Platform SDKをインストールすることにより、入手できます。よってまずはPlatform SDKをインストールする必要があります。Platform SDKは次のページからダウンロードできます。

-[[Platform SDK Update>http://www.microsoft.com/msdownload/platformsdk/sdkupdate/]]
-[[Windows Server 2003 SP1 Platform SDK Web Install>http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5]]
-[[Windows Server 2003 SP1 Platform SDK Full Download>http://www.microsoft.com/downloads/details.aspx?FamilyID=eba0128f-a770-45f1-86f3-7ab010b398a3]]
-[[Windows Server 2003 SP1 Platform SDK ISO Install>http://www.microsoft.com/downloads/details.aspx?FamilyID=d8eecd75-1fc4-49e5-bc66-9da2b03d9b92]]

インストール後、「Orca.msi」というファイルを探し、これを使ってインストールします。

しかしPlatform SDKには非常に多くのファイルが含まれていますので、かなりのサイズになります。Orcaのみを入手するためにインストールするにしては、あまりにばかげています。

幸いにも、Windows Installer SDKの古いバージョンはサイズが小さく、まだ配布されていますので、バージョンにこだわれなければこれをダウンロードしてインストールするのが手軽です。

-[[Windows Installer SDK (x86)>http://www.microsoft.com/downloads/details.aspx?FamilyID=e96f8abc-62c3-4cc3-93ad-bfc98e3ae4a3]]
-[[Windows Installer 1.0 SDK (x86)>http://www.microsoft.com/downloads/details.aspx?FamilyID=105dfc41-801e-4441-aa75-7696d794f109]]
-[[Windows Installer 1.0 SDK (Alpha)>http://www.microsoft.com/downloads/details.aspx?FamilyID=be81064e-a64e-4954-878f-8d462deb94f8]]

***「デスクトップにショートカットを作成するかユーザーが選択できるようにする」の補足 [#r3f38681]

.NETプログラミング研究第58号で「デスクトップにショートカットを作成するかユーザーが選択できるようにする」という方法を紹介しましたが、その補足をします。

この記事では、カスタムアクションを使ってシュートカットを作成する簡単な例を示しましたが、もう少し使えるコードに修正します。前のコードでは「すべてのユーザー」か「このユーザーのみ」かを考慮せずに常にユーザーのデスクトップフォルダにショートカットを作成していましたが、これを修正します。また、アンインストール時にショートカットを削除するようにします。(それ以外にも幾つかの点を変更しています。)

はじめに、ユーザーインターフェイスエディタで「チェックボックス」ダイアログを追加する点は変わりません。

次に、インストールで使用するカスタムアクションを次のようなVBScriptとします。

#code(vbscript){{
dim arg, args, desktop, WshShell, WshShortcut

'CustomActionDataを分解
arg = Session.Property("CustomActionData")
args = Split(arg, ":::")

if args(2)="1" then
    set WshShell = CreateObject("WScript.Shell")
    'デスクトップのパスを取得
    if args(3)="1" then
        desktop = WshShell.SpecialFolders("AllUsersDesktop")
    else
        desktop = WshShell.SpecialFolders("Desktop")
    end if
    'ショートカットを作成
    On Error Resume Next
    set WshShortcut = _
        WshShell.CreateShortcut(desktop & "\" & args(1) & ".lnk")
    WshShortcut.TargetPath = args(0)
    WshShortcut.Save
end if
}}

これを「カスタム動作」の「インストール」に追加し、CustomActionDataプロパティを

[TARGETDIR]app.exe:::アプリケーション:::[CHECKBOXA1]:::[ALLUSERS]

のようにします。ここで「app.exe」はショートカットのリンク先のファイル名、「アプリケーション」はショートカットの名前とします。

次にショートカットを削除するためのカスタムアクションを作成します。

#code(vbscript){{
dim arg, args, desktop, path, WshShell, fso

'CustomActionDataを分解
arg = Session.Property("CustomActionData")
args = Split(arg, ":::")

'デスクトップのパスを取得
set WshShell = CreateObject("WScript.Shell")
if args(1)="1" then
    desktop = WshShell.SpecialFolders("AllUsersDesktop")
else
    desktop = WshShell.SpecialFolders("Desktop")
end if
'削除するファイルのパス
path = desktop & "\" & args(0) & ".lnk"
'ショートカットを削除
set fso = CreateObject("Scripting.FileSystemObject")
if (fso.FileExists(path)) then
    On Error Resume Next
    fso.DeleteFile(path)
end if
}}

これを「カスタム動作」の「アンインストール」と「ロールバック」に追加し、それぞれのCustomActionDataプロパティを

アプリケーション:::[ALLUSERS]

のようにします。「アプリケーション」は「インストール」で指定したショートカットの名前と同じにしてください。

これで「すべてのユーザー」か「このユーザーのみ」かで適切なフォルダにショートカットが作成されるようになるでしょう。

***RemovePreviousVersionsプロパティを使ってMajor Upgradeを行う際の注意事項 [#n25859ac]

前回アップデートの方法について説明しましたが、幾つか注意すべき点があります。ここではその注意点と対処法を紹介します。

***VS.NET 2002での注意 [#k3bb4600]

VS.NET 2002では、はじめのインストールで「すべてのユーザー」とした場合、アップデートでRemovePreviousVersionsプロパティが機能しないようです。これを修正するには、OrcaでInstallUISequenceテーブルのFindRelatedProductsのSequenceがWelcomeFormの後になるようにします。詳しくは、次のリンクをご覧ください。

-[[RE: RemovePreviousVersions does not work>http://groups.google.co.jp/group/microsoft.public.dotnet.framework/msg/8573500622f22a7a?hl=ja&]]

***「すべてのユーザー」がデフォルトになるようにする [#qa60b0bf]

#column(注意){{
この記事の最新版は「[[「すべてのユーザー」がデフォルトになるようにする>http://dobon.net/vb/dotnet/deployment/allusersdefault.html]]」で公開しています。
}}

前回説明したとおり、前のバージョンのインストールが「このユーザーのみ」で、新しいバージョンを「すべてのユーザー」としてインストールすると、RemovePreviousVersionsプロパティは機能しません(逆にはじめが「すべてのユーザー」で「このユーザーのみ」としてインストールする場合もダメです)。しかも、VS.NETで作成したMSIファイルではデフォルトが「このユーザーのみ」に固定されており、変更できません。まずはこのデフォルトを「すべてのユーザー」に変更する方法を紹介します。

まずデフォルトの設定を変更するために、Windows Installerのプロパティ、ALLUSERSを2とします(注)。

-[[ALLUSERS Property>http://msdn.microsoft.com/library/en-us/msi/setup/allusers.asp]]

注:ALLUSERSを1とした場合は「すべてのユーザー」インストールができない環境ではエラーが発生します。ALLUSERSを2とすることにより、「すべてのユーザー」としてインストールできない時に「このユーザーのみ」としてインストールされるようにできます。「すべてのユーザー」としてインストールできない環境では、「すべてのユーザー/このユーザーのみ」チェックボックスは表示されないようになっていますので、ALLUSERS=2で問題ないでしょう。

また、ダイアログのチェックボックスがデフォルトで「すべてのユーザー」となるようにするために、Propertyテーブルの「FolderForm_AllUsers」のValueを「ME」から「ALL」に変更します。

以上を変更して保存すればOKです。

補足:VS.NETで作成されるMSIファイルでは、チェックボックスで指定された設定を調べてALLUSERSの値を設定するようになっています(「すべてのユーザー」の場合はALLUSERSが2となります)。ただしこれは「次へ」ボタンが押された時に行われるため、サイレントインストールなどでは実行されません。よってここでは、FolderForm_AllUsersだけでなく、ALLUSERSのデフォルトも変更しています。

***「すべてのユーザー/このユーザーのみ」チェックボックスを隠す [#sde83f12]

#column(注意){{
この記事の最新版は「[[「すべてのユーザー/このユーザーのみ」チェックボックスを隠す>http://dobon.net/vb/dotnet/deployment/hideallusersoption.html]]」で公開しています。
}}

デフォルトを変更したところで、ユーザーが変更できるのであれば、やはりRemovePreviousVersionsプロパティが機能しない問題は解決されません。次に「すべてのユーザー/このユーザーのみ」チェックボックスを隠して、設定を変更できないようにする方法を紹介します(注)。

注:またはサイレントインストールとし、ユーザーが設定を変更できないようにする方法もあります。サイレントインストールに関しては、第59号で説明しました。

このチェックボックス(およびその上に表示されるテキスト)はNT系OSでのみ表示されますが、これを制御しているのが、ControlConditionテーブルです。ここで次の2つの行

|Dialog_|Control_|Action|Condition|h
|FolderForm|AllUsersRadioGroup|Show|VersionNT>=400 AND Privileged=1|
|FolderForm|AllUsersText|Show|VersionNT>=400 AND Privileged=1|

のAction列を「Show」から「Hide」に変更することにより、常にチェックボックスが隠れるようになります。

もう一つの方法は、Controlテーブルでコントロールを直接制御する方法です。ControlConditionテーブルでShowされているため、ControlテーブルのAttributes列でVisibleフラッグをはずしても表示されてしまいます。よって手っ取り早く非表示にする方法は、Widthを0とすることでしょう。よって、次の2つの行(Height以降の列を省略しています)

|Dialog_|Control|Type|X|Y|Width|h
|FolderForm|AllUsersRadioGroup|RadioButtonGroup|24|210|342|
|FolderForm|AllUsersText|Text|18|186|348|

のWidth列を「0」とすることにより、表示されなくなります。

もっと全うな方法で行うならば(つまりControlConditionテーブルの設定を削除し、ControlテーブルのAttributes列の値を変更する)、次の情報を参考にしてください。

-[[How to use the Orca database editor to remove the "Everyone" option and the "Just me" option from a Windows Installer package that you created by using Visual Studio .NET>http://support.microsoft.com/kb/835460/]]

補足:VS.NET 2005からは、以上の設定はデプロイメントプロジェクトのプロパティで変更できるようになるようです。

***設定ファイルの上書きを防ぐ [#xa86ce57]

#column(注意){{
この記事の最新版は「[[設定ファイルの上書きを防ぐ >http://dobon.net/vb/dotnet/deployment/avoidoverwriting.html]]」で公開しています。
}}

設定ファイルなどのファイルをMSIファイルで配置した場合、通常はアンインストールで削除されてしまいます。よって、RemovePreviousVersionsプロパティを使ってアップデートした時も削除され、新しいファイルに置き換わってしまいます。

これを防ぐためには、設定ファイルのPermanentプロパティをTrueにしてアンインストールで削除しないようにするか、インストーラで配置するのではなく、アプリケーション自身で設定ファイルを作成するような方法があります。ただしこのような方法では、本当にアプリケーションをアンインストールしたい時も、設定ファイルは削除されずに残ることになります。

補足:設定ファイルをアンインストールで削除させずに残す場合、そのファイルが新しいファイルで上書きされるかについては、前回説明しました。

このような問題を解消する別の方法が次のリンク先で紹介されています。

-[[Uninstall a Previous Application Installation When Upgrading an Application with Setups Created in VS.NET - Part 1>http://www.codeproject.com/useritems/msi_upgrade_uninstall.asp]]

ここで紹介されている方法は、RemovePreviousVersionsプロパティで前のバージョンをアンインストールしてから新しいバージョンをインストールするのではなく、インストールしてからアンインストールするという方法です。

具体的には、OrcaでMSIファイルを開き、InstallExecuteSequenceテーブルにあるRemoveExistingProductsアクションのSequence番号を一番最後になるように設定します。通常はInstallFinalizeアクションが最後で、そのSequence番号は6600ですので、それ以上の数(6700など)にして、保存します。

**コメント [#t6bd7a31]
#comment

//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2005-10-20 (木) 18:00:00,DOBON!,2010-03-22 (月) 02:51:18,DOBON!)


[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]