Как правильно установить одну политику издателя в GAC с использованием WIX?
Как правильно установить одну политику издателя в GAC с использованием WIX 3.5?
Я пытался сделать это:
<File
Id="LIBGAC"
Assembly=".net"
KeyPath="yes"
Vital="yes"
Name="ClassLibrary1.dll"
ProcessorArchitecture="msil"
DiskId="1"
Source="..\ClassLibrary1\bin\Release\ClassLibrary1.dll" >
</File>
</Component>
<Component Id="Config" Guid="F089B1AA-B593-4662-9DF4-F47EB9FBA1F4" >
<File
Id="LIBGACPolicy"
Assembly=".net"
KeyPath="yes"
Vital="yes"
Name="Policy.1.0.ClassLibrary1.dll"
DiskId="1"
Source="..\ClassLibrary1\policy.1.0.ClassLibrary1.dll" >
</File>
<File
Id="LIBGACPolicyConfig"
Source="..\ClassLibrary1\policy.1.0.ClassLibrary1.config"
CompanionFile="LIBGACPolicy">
</File>
</Component>
</Directory>
При компиляции с VS2008 появляется эта ошибка:
policy.1.0.ClassLibrary1.dll представляется недействительным. Убедитесь, что это действительный файл сборки и что у пользователя есть соответствующие права доступа к этому файлу. Дополнительная информация: HRESULT: 0x8013101b
И, наконец, при компиляции с VS2010 проблем не возникает. Но при завершении процесса установки DLL хорошо установлена, а политика издателя - нет. Также я прочитал журнал, сгенерированный во время установки, и не смог найти причину.
Спасибо за прочтение.
3 ответа
Я делал что-то подобное и хорошо работает с помощью Visual Studio 2010 и на сервере сборки с MsBuild:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="Gac" Name="Gac">
<!-- The component with the assembly -->
<Component Id="MiClassDLL" Guid="*">
<File Id="MiClass.dll" Assembly=".net" KeyPath="yes"
Source="$(var.MiClass.TargetPath)" />
</Component>
<!-- The component with the policy -->
<Component Id="PolicyMiClassDLL" Guid="{YOUR_GUID_HERE}">
<File Id="PolicyMiClass.dll" KeyPath="yes"
Source="$(var.MiClass.TargetDir)Policy.1.0.MiClass.dll" />
<File Id="PolicyMiClass.config" KeyPath="no"
Source="$(var.MiClass.ProjectDir)Policy.1.0.MiClass.config" />
</Component>
</Directory>
</Directory>
</Directory
В моем случае у меня есть файл policy.config в том же каталоге проекта, и я создаю dll политики в том же выводе, чтобы упростить сценарий установщика.
Я заметил, что у компонента политики должен быть guid, и по некоторым причинам он требует, чтобы внутренняя политика dll и файлы конфигурации находились в одном каталоге / компоненте.
Я создаю сборку политики в событии Post-Build проекта MiClass с помощью этой команды:
"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\al.exe"
/link:"$(ProjectDir)Policy.1.0.MiClass.config"
/out:"$(TargetDir)Policy.1.0.MiClass.dll"
/keyfile:"$(SolutionDir)MyKeys.snk"
/comp:"My Company"
/prod:"My Product"
/productv:1.0
/version:1.0.0.0
Я надеюсь, что это работает для вас.
Вместо ключа /link используйте /embed для компиляции xml-config в политику издателя. тогда вы можете без проблем установить полученную сборку в GAC
Я немного поработал с политиками DLL, и единственное отличие, которое я вижу, в том, что ваше соглашение об именовании файлов немного отличается от нашего.
Вместо
policy.1.0.ClassLibrary1.dll
policy.1.0.ClassLibrary1.config
Мы использовали
policy.1.0.ClassLibrary1.dll
ClassLibrary1.dll.config