Ошибки хеширования ClickOnce при использовании средства перезаписи контракта кода

Я создаю развертывание ClickOnce.

Теперь я использую средство перезаписи CodeContracts, что означает, что манифест приложения создается до того, как CodeContracts изменит мою сборку.

Поэтому я обновляю файл манифеста приложения, указав актуальный хэш и размер файла. Вот алгоритм вычисления хеша:

    public static string ComputeHash(FileInfo info)
    {
        SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
        byte[] hashBytes = sha1.ComputeHash(info.OpenRead());
        return Convert.ToBase64String(hashBytes);
    }

Затем я сохраняю манифест. Затем я обновляю манифест развертывания ClickOnce (.application), который имеет хэш и размер для манифеста приложения, используя ту же процедуру вычисления хэша.

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

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

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

В любом случае, я могу понять, почему проверка хэша не работает, когда я думаю, что она действительна?

Или, что еще лучше, есть ли способ генерировать манифесты после того, как переписчик кодовых контрактов закончит взламывать мои исполняемые файлы?

Спасибо


person Stephen Drew    schedule 09.06.2011    source источник


Ответы (1)


Пробовали ли вы Mage обновить и отказаться от ваших манифестов? Посмотрите на команды Update (-u) и Sign (-s).

person codeConcussion    schedule 09.06.2011
comment
Я не подписываю манифест в данный момент, так что это не проблема. Я бы предпочел избегать использования Mage, так как хочу использовать API непосредственно в процессе сборки. - person Stephen Drew; 10.06.2011
comment
Кроме того, я попытался вызвать метод ApplicationManifest.UpdateFileInfo() в коде, и он не исправляет поврежденные хэши и размеры файлов. - person Stephen Drew; 10.06.2011
comment
Вы пытались выполнить вызов ResolveFiles() перед вызовом UpdateFileInfo()? - person codeConcussion; 13.06.2011