Я создал проект установщика WiX для развертывания моего приложения .net winform на машине клиента. Приложение сканирует документы и сохраняет изображения в базе данных на сервере. Сканер довольно специфичен и только один в компании, но есть прибл. четыре пользователя, которые могут иногда использовать приложение it =>, будут установлены только на одной рабочей станции, предназначенной только для сканирования, - большую часть времени она будет бесплатной, и любой из этих пользователей может прийти, сканировать документы и продолжать работу.WiX3 - util: элемент XmlFile выполняется снова, когда новый пользователь сначала использует установку для каждой машины.
=> я делаю установку для каждой машины: ALLUSERS жестко закодировано 1.
Поскольку серверы баз данных в производство не контролируется мной и я не знаю, где будет храниться в базе данных, Я не могу упаковать корректный файл ConnectionStrings.config в архив MSI. Вместо него настройка изменяет эту конфигурацию в соответствии с параметрами, предоставленными пользователем во время установки. Для обновления строк подключения я использую элемент: XmlFile. Файл connectionstrings.config хранится в каталоге установки вместе с бинарниками приложений.
Все, казалось, работает нормально, пока я не смоделировал двух пользователей, использующих эту установку для каждой машины. Я выполнил мой проект установки wix под своей учетной записью, файл конфигурации XML был правильно обновлен, а затем я запустил приложение и протестировал строки подключения в порядке. Все было отлично.
Затем я перешел на другую учетную запись пользователя. Ярлык уже присутствовал в меню программы - так же, как я ожидал, поскольку установка выполняется для каждой машины. Поэтому я нажал ярлык, а затем (неожиданно для меня) окно индикатора выполнения «Подождите, пока не закончится конфигурация продукта XY». появился. (Обратите внимание, что мой язык машины не является английским, сообщение, вероятно, будет немного отличаться на рабочей станции английского языка). Через несколько секунд окно исчезло, и мое приложение запустилось. К сожалению, он не смог подключиться к базе данных, так как файл connectionStrings.config был переписан - строки подключения были обновлены с использованием значений свойств по умолчанию (= неверно).
Я изучаю, почему установка запускается снова всякий раз, когда новая учетная запись пользователя пытается ее использовать. Это из-за элемента ярлыка (ярлык помещается в «ProgramMenuFolder». Существует запрос на удаление, который AFAIK требует родительского компонента, и этому компоненту нужен KeyPath, который должен быть разделом реестра в HKCU.). Когда я удаляю все программы-меню-ярлыки из WXS, MSI не запускается снова после переключения пользовательского контекста.
Результатом является то, что у меня есть программа установки, которая может настраивать соединение с базой данных в соответствии с входными параметрами. Но любая последующая попытка использовать приложение со второй учетной записи пользователя просто отправляет эту конфигурацию в туалет. В производственной среде это означало бы, что администратор должен и вручную менять строки подключения каждый раз, когда новый пользователь пытается использовать приложение, что, конечно, неприемлемо.
Это упрощенная версия моего источника 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) Я пробовал добавить NOT INstalled под этими компонентами.
3) Я попытался записать значение реестра в HKLM во время установки.Я добавил RegistrySearch и свойство для этого значения реестра, а затем использовал это значение как условие (на самом деле просто замена «NOT Installed» из предыдущего)
Может ли кто-нибудь помочь в этом? Что я делаю не так?
Спасибо советы
Marek
Как насчет укоренения реестра в разделе «HKLM»? Это устраняет проблему? –
Hi Frédéric, да, это, вероятно, решит проблему, но WiX не позволяет этого - «ProgramMenuDir считается принадлежащим к профилю пользователя (даже при установке для всех пользователей), а WiX требует, чтобы ключевой путь для каталога был внедрен в HKCU :-(.. – Marzena
обновление до предыдущего: при укоренении значения реестра в HKLM генерируется ошибка компиляции ICE38: «ICE38: компонентная программаMenuDir устанавливается в профиль пользователя. Ключ реестра KeyPath должен подпадать под HKCU». – Marzena