Каков был бы правильный способ установить одну политику издателя в GAC с использованием WIX? - PullRequest
4 голосов
/ 17 октября 2011

Как правильно установить одну политику издателя в 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 ]

2 голосов
/ 17 мая 2012

Я делал что-то похожее и хорошо работает, используя 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 политики и файлы конфигурации находились в одном каталоге /component.

Я собираю сборку политики в событии 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

Надеюсь, это сработает для вас.

0 голосов
/ 14 августа 2013

вместо ключа / link используйте / embed для компиляции xml-config в политику издателя.тогда вы можете без проблем установить полученную сборку в GAC

0 голосов
/ 19 октября 2011

Я немного поработал с политиками dll, и я вижу только одно отличие - ваше соглашение об именах файлов немного отличается от нашего.

Вместо

policy.1.0.ClassLibrary1.dll
policy.1.0.ClassLibrary1.config

Мы использовали

policy.1.0.ClassLibrary1.dll
ClassLibrary1.dll.config
...