1

.netwinformアプリを顧客のマシンに展開するためのWiXインストーラープロジェクトを作成しました。アプリはドキュメントをスキャンし、画像をサーバー上のデータベースに保存するだけです。スキャナーは非常に特殊で、社内に1つしかありませんが、約1台あります。たまに使用できる4人のユーザー=>アプリはスキャン専用の単一のワークステーションにインストールされます-ほとんどの場合無料で、これらのユーザーは誰でもドキュメントをスキャンして作業を続けることができます。

=>マシンごとのインストールを行っています:ALLUSERSは1にハードコードされています。

本番環境のデータベースサーバーは私によって制御されておらず、データベースがどこに保存されるか本当にわからないため、正しいConnectionStrings.configファイルをMSIアーカイブにパックできません。その代わりに、セットアップは、インストール中にユーザーから提供されたパラメーター値に従ってこの構成を変更します。接続文字列を更新するには、util:XmlFile要素を使用します。connectionstrings.configファイルは、アプリのバイナリと一緒にインストールディレクトリに保存されます。

このマシンごとのインストールを使用して2人のユーザーをシミュレートするまで、すべてが正常に機能しているように見えました。自分のアカウントでwixセットアッププロジェクトを実行し、XML構成ファイルが正しく更新された後、アプリケーションを起動して、接続文字列に問題がないことをテストしました。すべてが大丈夫でした。

次に、別のユーザーアカウントに切り替えました。インストールがマシンごとであるため、私が予想したように、ショートカットはプログラムメニューにすでに存在していました。そこで、ショートカットをクリックしてから、(予期せずに)プログレスバーウィンドウ「製品XYの構成が完了するまで待ちます」をクリックしました。現れた。(私のマシンロケールは英語ではないことに注意してください。英語ロケールのワークステーションでは、メッセージが少し異なる可能性があります)。数秒後、ウィンドウが消え、アプリケーションが起動しました。残念ながら、connectionStrings.configファイルが書き直されたため、データベースに接続できませんでした。接続文字列は、デフォルトの(=不正な)プロパティ値を使用して更新されました。

私は、新しいユーザーアカウントがセットアップを使用しようとするたびに、セットアップが再び起動する理由を調査してきました。これは、ショートカット要素が原因です(ショートカットは「ProgramMenuFolder」に配置されます。アンインストールアクションの要求があり、AFAIKには親コンポーネントが必要であり、このコンポーネントにはKeyPathが必要です。KeyPathはHKCUのレジストリキーである必要があります)。WXSからすべてのProgram-Menu-Shortcut-stuffを削除すると、ユーザーコンテキストを切り替えた後、MSIが再度起動されません。

その結果、入力パラメータに従ってデータベースへの接続を構成できるセットアッププログラムができました。ただし、後で2番目のユーザーアカウントからアプリを使用しようとすると、この構成がトイレに送信されます。これは、実稼働環境では、新しいユーザーがアプリを使用しようとするたびに、管理者が接続文字列を手動で変更する必要があることを意味します。これはもちろん許容できない動作です。

これは私のWiXソースの簡略化されたバージョンです:

    <?define ProductID = "11111111-1111-1111-1111-111111111111" ?>
    <?define ProductName = "MyProduct" ?>
    <?define ProductLocalName = "MyLocalLanguageProductName" ?>

    <!-- application's root registry path, where it stores its settings -->
    <?define ApplicationRootRegistryKey = "Software\MyCompany\MyProject\MyBuildConfiguration" ?>

    <Product Id="$(var.ProductID)" UpgradeCode="{11111111-1111-1111-1111-111111111112}"
             Name="$(var.ProductName)" Version="1.10.1103" 
             Manufacturer="MyCompany"Language="1029" Codepage="1250">

    <Package Id="*" InstallerVersion="200" Compressed="yes"
             Description="$(var.ProductName) Installer" Languages="1029" 
             SummaryCodepage="1250" />

        <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

        <!-- always install the app for all users -->
        <Property Id="ALLUSERS" Value="1"/>

        <!-- initialize properties used for adjusting connection strings.
             The user will provide valid property values through command-line -->
        <Property Id="DB_SERVER_NAME" Value="please-specify-db-server-name"/>
        <Property Id="DB_NAME" Value="please-specify-db-name"/>

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="PFiles">
                <Directory Id="CompanyProgramFilesFolder" Name="CompanyName" >
                    <Directory Id="INSTALLDIR" Name="ProjectName">
                        <Directory Id="InstallDirApp" Name="Bin" />
                    </Directory>
                </Directory>
            </Directory>
            <Directory Id="ProgramMenuFolder" Name="Programs">
                <Directory Id="AppProgramMenuDir" Name="$(var.ProductLocalName)">
                    <Component Id="ProgramMenuDir" Guid="*">
                        <RemoveFolder Id='AppProgramMenuDir' On='uninstall'/>
                        <RegistryValue Root='HKCU' Key='$(var.ApplicationRootRegistryKey)' Type='string' Value='' KeyPath='yes' />
                    </Component>
                </Directory>
            </Directory>
        </Directory>

        <DirectoryRef Id="InstallDirApp">
            <Component Id="Executable" Guid="*">
                <File KeyPath="yes" Source="$(var.MyProject.TargetPath)">
                    <Shortcut Id="ProgramMenuShortcut" Name="$(var.ProductLocalName)"
                              Directory="AppProgramMenuDir" Advertise="yes"
                              WorkingDirectory="InstallDirApp" Icon="AppIcon.ico" IconIndex="0"/>
                </File>
            </Component>

            <!-- ConnectionStrings config file deployment and settings adjustment -->
            <Component Id="ConnectionStrings.config" Guid="*">
                <File KeyPath="yes" Source="$(var.Csob.ChequesScanning.SmartShell.TargetDir)ConnectionStrings.config" />
            <!--</Component>

            <Component Id="xml01" Guid="*">-->
                <!--<Condition><![CDATA[NOT Installed]]></Condition>-->

                <!-- this sets the connection strings according to provided parameters -->
                <util:XmlFile Id="SetConnectionString" Action="bulkSetValue"
                              File="[#ConnectionStrings.config]"
                              ElementPath="//add" Name="connectionString"
                              Value="Data Source=[DB_SERVER_NAME];Initial Catalog=[DB_NAME];Integrated Security=True;Pooling=True"
                              Permanent="yes" />
            </Component>
        </DirectoryRef>

        <Icon Id="AppIcon.ico" SourceFile="$(var.MyProject.ProjectDir)Resources\AppIcon.ico" />


        <Feature Id="ProductFeature" Title="MyProjectName" Level="1">
            <ComponentRef Id="Executable" />
            <ComponentRef Id="ConnectionStrings.config"/>
            <ComponentRef Id="ProgramMenuDir" />
        </Feature>

    </Product>
</Wix>

問題を解決するためにこれらの手順を試しましたが、何も役に立ちませんでした
。1)とを独立したコンポーネントに分離しました。
2)これらのコンポーネントの下にインストールされていないものを追加しようとしました。
3)インストール中にHKLMにレジストリ値を書き込んでみました。そのレジストリ値のRegistrySearchとPropertyを追加し、その値を条件として使用しました(実際には、以前の「未インストール」の単なる置き換え)

誰かがこれを手伝うことができますか?私は何が間違っているのですか?

アドバイスありがとう

マレク

4

1 に答える 1

0

レジストリ キーをルート化しますHKMU (参照を参照)。これにより、ALLUSERS プロパティの値に応じて、HKLM または HKCU のレジストリ キーが正しくルート化されます。

于 2010-11-08T13:01:36.717 に答える