Установщик VS2012 и XML-преобразования SlowCheetah

Я пробую опцию публикации для проекта службы Windows в VS2012.

Я использую NLog, и у меня есть файл NLog.config. Я также использую SlowCheetah для преобразования этого файла конфигурации для каждой конфигурации сборки.

Когда я пытаюсь запустить полученный setup.exe, я получаю сообщение об ошибке

Файл NLog.config имеет другой вычисленный хеш, чем указано в манифесте.

Я полагаю, что хэш был рассчитан для версии NLog.config до преобразования. Как заставить мастера публикации использовать правильную, преобразованную версию NLog.config?

ОБНОВЛЕНИЕ (на основе запроса Сайеда для более подробной информации)

Мой проект службы Windows использует NLog. Файл NLog.config помечен как действие по созданию содержимого. Это выглядит примерно так (сокращенная версия)

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="File" name="ferr" fileName="C:/MyPath/Error.log"
        archiveFileName="C:/MyPath/Error.{#}.txt"
        archiveEvery="Day"
        archiveNumbering="Rolling"
        maxArchiveFiles="28"
        layout="${longdate} ${uppercase:${level}} ${message}" />
  </targets>

  <rules>
    <logger name="*" minlevel="Error" writeTo="ferr" />
  </rules>
</nlog>

Я использую Медленный Гепард, чтобы добавить преобразование для этого файла. Преобразование для конфигурации решения QA выглядит следующим образом:

NLog.QA.config

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xmlns="http://www.nlog-project.org/schemas/NLog.xsd">
  <targets>
    <target xsi:type="Mail" name="m"
            to="me@not.really" from="notify@not.really" html="True"
            subject="QA ERROR on ${machinename}"
            smtpServer="127.0.0.1"
            layout="${longdate} ${uppercase:${level}} ${message}" xdt:Transform="Insert" />
  </targets>
  <rules>
    <logger name="*" minlevel="Fatal" writeTo="m" xdt:Transform="Insert" />
  </rules>
</nlog>

Преобразование приводит к тому, что конечный NLog.config в выходных данных сборки отличается от NLog.config в проекте (правила преобразования, определенные в NLog.QA.config, применяются к исходному NLog.config для получения окончательного NLog.config).

Когда я использую опцию "Опубликовать", чтобы создать файл setup.exe и связанные с ним файлы, скопировать все эти файлы на новый компьютер QA и попытаться запустить файл setup.exe, я получаю сообщение об ошибке

Файл NLog.config имеет другой вычисленный хеш, чем указано в манифесте.

Основываясь на сообщении об ошибке, я подозреваю, что вычисленный хэш, указанный в манифесте, основан на файле NLog.config, как он появляется в исходном проекте, а не на преобразованной окончательной версии, созданной в результате сборки.

Обратите внимание, что у меня также есть преобразование для моего app.config. Я не получил подобную ошибку для преобразованного app.config. Однако я не знаю, было ли это потому, что setup.exe сдался перед тем, как попасть в app.config, или это потому, что дело app.config обрабатывается правильно.

ОБНОВЛЕНИЕ 2

Вот полное сообщение об ошибке

PLATFORM VERSION INFO
    Windows             : 6.0.6002.131072 (Win32NT)
    Common Language Runtime     : 4.0.30319.17929
    System.Deployment.dll       : 4.0.30319.17929 built by: FX45RTMREL
    clr.dll             : 4.0.30319.17929 built by: FX45RTMREL
    dfdll.dll           : 4.0.30319.17929 built by: FX45RTMREL
    dfshim.dll          : 4.0.41209.0 (Main.041209-0000)

SOURCES
    Deployment url          : file:///C:/Xfer/MyService/MyService.application
    Application url         : file:///C:/Xfer/MyService/Application%20Files/MyService_1_0_0_3/MyService.exe.manifest

IDENTITIES
    Deployment Identity     : MyService.application, Version=1.0.0.3, Culture=neutral, PublicKeyToken=56e62aa7113b4840, processorArchitecture=msil
    Application Identity        : MyService.exe, Version=1.0.0.3, Culture=neutral, PublicKeyToken=56e62aa7113b4840, processorArchitecture=msil, type=win32

APPLICATION SUMMARY
    * Installable application.

ERROR SUMMARY
    Below is a summary of the errors, details of these errors are listed later in the log.
    * Activation of C:\Xfer\MyService\MyService.application resulted in exception. Following failure messages were detected:
        + File, NLog.config, has a different computed hash than specified in manifest.

COMPONENT STORE TRANSACTION FAILURE SUMMARY
    No transaction error was detected.

WARNINGS
    There were no warnings during this operation.

OPERATION PROGRESS STATUS
    * [8/22/2012 11:10:55 PM] : Activation of C:\Xfer\MyService\MyService.application has started.
    * [8/22/2012 11:10:55 PM] : Processing of deployment manifest has successfully completed.
    * [8/22/2012 11:10:55 PM] : Installation of the application has started.
    * [8/22/2012 11:10:55 PM] : Processing of application manifest has successfully completed.
    * [8/22/2012 11:10:57 PM] : Found compatible runtime version 4.0.30319.
    * [8/22/2012 11:10:57 PM] : Request of trust and detection of platform is complete.

ERROR DETAILS
    Following errors were detected during this operation.
    * [8/22/2012 11:10:58 PM] System.Deployment.Application.InvalidDeploymentException (HashValidation)
        - File, NLog.config, has a different computed hash than specified in manifest.
        - Source: System.Deployment
        - Stack trace:
            at System.Deployment.Application.ComponentVerifier.VerifyFileHash(String filePath, Hash hash)
            at System.Deployment.Application.ComponentVerifier.VerifyFileHash(String filePath, HashCollection hashCollection)
            at System.Deployment.Application.ComponentVerifier.FileComponent.Verify()
            at System.Deployment.Application.ComponentVerifier.VerifyComponents()
            at System.Deployment.Application.DownloadManager.DownloadDependencies(SubscriptionState subState, AssemblyManifest deployManifest, AssemblyManifest appManifest, Uri sourceUriBase, String targetDirectory, String group, IDownloadNotification notification, DownloadOptions options)
            at System.Deployment.Application.ApplicationActivator.DownloadApplication(SubscriptionState subState, ActivationDescription actDesc, Int64 transactionId, TempDirectory& downloadTemp)
            at System.Deployment.Application.ApplicationActivator.InstallApplication(SubscriptionState& subState, ActivationDescription actDesc)
            at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
            at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)

COMPONENT STORE TRANSACTION DETAILS
    No transaction information is available.

ОБНОВЛЕНИЕ 3

Глядя на файлы, созданные Publish, NLog.config.deploy - это не тот преобразованный файл, который я ожидал, а скорее имеет то же содержимое, что и исходный *NLog.config". Преобразование, указанное в NLog.QA.config, не было применено.

Размер файла NLog.config.deploy составляет 1353 байта. Однако manifest () утверждает, что размер файла должен составлять 1696 байт (что в точности соответствует преобразованному размеру)

  <file name="NLog.config" size="1696">
    <hash>
      <dsig:Transforms>
        <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
      </dsig:Transforms>
      <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
      <dsig:DigestValue>IbzW1PndPFYBt59Yrcl6Ax8F5GFX3VVco7wIdDrV6Fo=</dsig:DigestValue>
    </hash>
  </file>

Файл находится в папке, где написано setup.exe, в

Файлы приложений \MyService_1_0_0_0\NLog.config.deploy

Кроме того, я замечаю в

C:...\MyProject\ OBJ \QA\SlowCheetah

есть файл app.config, но нет файла NLog.config.

ОБНОВЛЕНИЕ 4

Теперь, когда я делаю нормальную сборку с решением, установленным на QA, NLog.config больше не преобразуется. Однако app.config преобразуется. Затем я перешел на вкладку "Публикация" настроек проекта. Я не сделал никаких изменений, но.csproj был изменен так или иначе (рядом с именем был знак *... Я не подтвердил, что это были за изменения). Сохранено, построено, и внезапно преобразование NLog.config было применено. Публикуется снова, и внезапно файл NLog.config снова не применяется. Что-то с настройками публикации нарушает способность SlowCheetah применять преобразование к NLog.config.

К сожалению, на этом этапе мне придется вернуться к предыдущей версии проекта, в которой не было ничего из публикации, и продолжить работу над завершением кода. Я надеюсь, что этого достаточно, чтобы отследить проблему.

2 ответа

Немного поздно, чтобы ответить, но недавно у меня возникла похожая проблема, когда преобразования не были применены к моему config и xml, и я получил "Файл SomeConfig.xml имеет вычисленный хэш, отличный от указанного в манифесте". ошибка.

Причиной этого в моем случае было то, что оба файла имели свойство "Копировать в выходной каталог", установленное на " Копировать всегда", когда я изменил его на " Не копировать" (как я понимаю, это значение по умолчанию), все стало работать так же, как и установка ClickOnce.,

Это решило это для меня:

right-click on your config file (для меня проблема была с app.config, а не nlog.config) и select properties,

На панели свойств set Copy to Output Directory = Copy Always (по умолчанию мой не копировать).

Интересно, что это полная противоположность ответу Макса Вязовского. Но это было единственное, что сработало для меня после почти целого дня просеивания форумов.

Это проект Windows Forms с конфигурационными преобразованиями и развертыванием ClickOnce.

Другие вопросы по тегам