У меня есть набор InstanceTransforms, определенных на стороне WiX, согласно ниже:Извлечение ProductCodes экземпляра преобразований определяется внутри от MSI с C#
<InstanceTransforms Property="INSTANCEID">
<Instance ProductCode="*" UpgradeCode="$(var.UpgradeCode)" ProductName="ProductName $(var.VersionText) (64 bit)" Id="$(var.InstanceId)"/>
<Instance ProductCode="*" UpgradeCode="$(var.UpgradeCode1)" ProductName="ProductName $(var.VersionText) (64 bit)" Id="$(var.InstanceId1)"/>
<Instance ProductCode="*" UpgradeCode="$(var.UpgradeCode2)" ProductName="ProductName $(var.VersionText) (64 bit)" Id="$(var.InstanceId2)"/>
<Instance ProductCode="*" UpgradeCode="$(var.UpgradeCode3)" ProductName="ProductName $(var.VersionText) (64 bit)" Id="$(var.InstanceId3)"/>
<Instance ProductCode="*" UpgradeCode="$(var.UpgradeCode4)" ProductName="ProductName $(var.VersionText) (64 bit)" Id="$(var.InstanceId4)"/>
</InstanceTransforms>
Я хотел бы извлечь в ProductCodes из экземпляр преобразует через мой загрузчик, который является приложением Windows C#, которое вызывает .msi. Поскольку эти ProductCodes генерируются динамически во время сборки установщика, я думал, что мне придется запросить msi с помощью сборки Microsoft.Deployment.WindowsInstaller. Однако при рассмотрении .msi с ORCA я не могу найти таблицу, которая позволила бы мне запрашивать ProductCodes экземпляров. В таблице свойств есть элемент ProductCode элемента Product.
Можно ли получить ProductCodes экземплярных преобразований? Когда я пытаюсь такая же версия обновления с теми же установками, я вижу ProductCode соответствующего InstanceTransform в журнале ошибок .msi в:
Указанного экземпляр {8F97345E-DDAD-4F03-9D17-820E929C59FE} с помощью преобразования уже установлено. MSINEWINSTANCE требует нового экземпляра , который не установлен.
Если кто-то может помочь мне с этим, это было бы здорово - спасибо заблаговременно!
Я подозреваю, что вам нужно знать имя и местоположение фактические файлы преобразования, файлы .mst. Затем вы сделаете эквивалент MsiOpenDatabase(), за которым следует MsiDatabaseApplyTransform, затем выполните запрос SQL в таблице Property, чтобы получить ProductCode. – PhilDW
Hiya Phil, большое спасибо за ваш ответ. Я вызываю свой экземпляр с помощью следующих свойств: INSTANCEID = INSTANCEID1 MSINEWINSTANCE = 1 TRANSFORMS = \ ": INSTANCE_TRANSFORM1 \". Поскольку я явно не ссылаюсь на файл .mst, я думал, что мои преобразования будут встроены в сам .msi, а не извне. В таком случае мне нужно будет вызвать MsiOpenDatabase() в самом файле .msi и сначала запросить таблицу _Storage? –