Диагностика Azure ищет StorageClient 1.7.0.0, но я использую StorageClient 1.7.1.0

Я использую Microsoft.WindowsAzure.StorageClient версии 1.7.1.0, доступный по адресу: https://github.com/WindowsAzure/azure-sdk-for-net/tree/sdk_1.7.1. Мой проект прекрасно компилируется, но когда я его запускаю, я получаю следующую ошибку:

Could not create Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.

с внутренним исключением:

Could not load file or assembly 'Microsoft.WindowsAzure.StorageClient, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)":"Microsoft.WindowsAzure.StorageClient, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

Похоже, Microsoft.WindowsAzure.Diagnostics зависит от версии 1.7.0.0 Microsoft.WindowsAzure.StorageClient. Однако я использую версию 1.7.1.0, и, насколько мне известно, в одном проекте не может быть и 1.7.0, и 1.7.1. Любые идеи, как сделать Microsoft.WindowsAzure.Diagnostics зависимым от 1.7.1, если это действительно проблема?

Спасибо, Курт


Обновлять


В соответствии с приведенной ниже рекомендацией я добавил задачу запуска для загрузки версии 1.7.0 с помощью gacutil (это было полезно http://blogs.infosupport.com/adding-assemblies-to-the-gac-in-windows-azure/). У меня есть 2 рабочие роли и 2 веб-роли. Проблема, с которой я столкнулся сейчас, заключается в том, что при компиляции и запуске VS2012 копирует 1.7.0 в соответствующую папку WebRoles ...\csx\Debug\roles[WebRoleName]\approot, несмотря на отсутствие прямой ссылки на версию 1.7. 0 в проекте. Следующие выходные данные компиляции показывают ошибку, которая появляется, когда Azure пытается загрузить версию 1.7.1 (которую теперь не может найти):

System.TypeLoadException: Unable to load the role entry point due to the following exceptions:
-- System.IO.FileLoadException: Could not load file or assembly 'Microsoft.WindowsAzure.StorageClient, Version=1.7.1.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Microsoft.WindowsAzure.StorageClient, Version=1.7.1.0, Culture=neutral, PublicKeyToken=null'

=== Pre-bind state information ===
LOG: User = BERTIES_MAIN\kurt_000
LOG: DisplayName = Microsoft.WindowsAzure.StorageClient, Version=1.7.1.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///H:/Everything/Current_Work/Web_Apps/Azure/InSysCloud/InSysCloud/InSysCloud/csx/Debug/roles/InSysWatcher/approot
LOG: Initial PrivatePath = H:\Everything\Current_Work\Web_Apps\Azure\InSysCloud\InSysCloud\InSysCloud\csx\Debug\roles\InSysWatcher\approot
Calling assembly : InSysWatcher, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: H:\Everything\Current_Work\Web_Apps\Azure\InSysCloud\InSysCloud\InSysCloud\csx\Debug\roles\InSysWatcher\approot\InSysWatcher.dll.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///H:/Everything/Current_Work/Web_Apps/Azure/InSysCloud/InSysCloud/InSysCloud/csx/Debug/roles/InSysWatcher/approot/Microsoft.WindowsAzure.StorageClient.DLL.
WRN: Comparing the assembly name resulted in the mismatch: PUBLIC KEY TOKEN
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Зачем VS2012 добавлять DLL для версии 1.7.0, когда 1.7.1 упоминается в самом проекте, а версия 1.7.0 включается только как содержимое и загружается в GAC при запуске приложения?


person ProfNimrod    schedule 11.10.2012    source источник
comment
Есть ли что-то особенное, что вам нужно в вашей версии? Честно говоря, я бы пока вернулся к официальному релизу 1.7.0. У вас будет эта проблема везде, где третья сторона пытается загрузить клиент хранилища (например, агент диагностики).   -  person dunnry    schedule 11.10.2012
comment
Я должен был использовать функцию Shared Access Key для таблиц и очередей, которая, как мне кажется, не поддерживается в версии 1.7.0. Я предполагаю (и очень надеюсь), что эта функциональность версии 1.7.1 войдет в официальную версию 1.8.   -  person ProfNimrod    schedule 12.10.2012


Ответы (2)


Что ж, в таких случаях вы должны использовать перенаправление привязки в файле web.config/app.config. Но проблема в PublicKeyToken. «Официальная» сборка 1.7.0.0 имеет следующий PublicKeyToken: 31bf3856ad364e35.

Теперь, поскольку вы сами создаете версию 1.7.1.0, вы получите другой PublicKeyToken, и в этом случае перенаправление привязки не работает.

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

  1. Включите сборку 1.7.0.0 в свой пакет, но добавьте ее как содержимое (а не как ссылку).
  2. Создайте задачу запуска, которая развертывает сборку в GAC (с помощью gacutil), поскольку задача запустится перед запуском вашей роли.
  3. Продолжайте использовать 1.7.1.0 с обычной ссылкой на сборку.
  4. Ваше приложение должно использовать код версии 1.7.1.0, а сборка диагностики должна иметь возможность использовать версию 1.7.0.0 из GAC.

У меня еще не было возможности проверить это, поэтому я с нетерпением жду ваших отзывов.

person Sandrino Di Mattia    schedule 11.10.2012
comment
ОК - это выглядит многообещающе. Я добавил задачу запуска с одной маленькой морщинкой - мне пришлось изменить имя файла сборки 1.7.0, иначе, когда я пытался добавить версию 1.7.1, Visual Studio ссылалась бы на 1.7.0 независимо от того, какую версию я пытался добавить прямо ссылка на. Во всяком случае, теперь у меня есть проблема, из-за которой, когда я пытаюсь создать свое решение, только для WorkerRoles, VS2012 помещает версию 1.7.0 (не 1.7.1) в папку csx/Debug/roles/WorkerRoleName/approot, несмотря на отсутствие прямого ссылка на него в моем проекте. Для WebRoles копируется правильная версия (1.7.1). Любые идеи? - person ProfNimrod; 12.10.2012
comment
Могу ли я заставить PublicKeyToken моего скомпилированного 1.7.1 быть 31bf3856ad364e35? - person ProfNimrod; 12.10.2012
comment
На самом деле я пытался изменить PublicKeyToken с помощью ILDASM, чтобы вырезать и вставлять соответствующие части 1.7.0 в 1.7.1, но потом понял, что у меня нет доступа к закрытому ключу Microsoft :-( Это означало, что мне пришлось отключить сильный проверка имени для полученного 1.7.1, когда это приведет к проблемам безопасности с методом GetObjectData... Что-то о нарушении правил безопасности наследования при переопределении члена... - person ProfNimrod; 12.10.2012
comment
Я также попытался просто переименовать и перекомпилировать версию 1.7.1 Microsoft.WindowsAzure.StorageClient с именем сборки Microsoft.WindowsAzure.StorageClient2 ‹ — обратите внимание на 2. Прекрасно работает в среде разработки, и Microsoft.WindowsAzure.Diagnostics тоже доволен. , так как 1.7.0 найдена и загружена. Однако это, по-видимому, не работает в производственной среде, поскольку опубликованный пакет включает Microsoft.WindowsAzure.StorageClient.dll и Microsoft.WindowsAzure.StorageClient2.dll в одной папке, и их типы конфликтуют. - person ProfNimrod; 12.10.2012
comment
Кстати, это не должно быть помечено как ответ, так как это не сработало для меня. У меня недостаточно очков репутации, чтобы проголосовать против. - person ProfNimrod; 15.10.2012

Похоже, я могу добавить следующую ссылку в свой web.config, чтобы обойти эту проблему:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.WindowsAzure.StorageClient"
                          publicKeyToken="31bf3856ad364e35"
                          culture="neutral" />
        <bindingRedirect oldVersion="1.1.0.0"
                         newVersion="1.7.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.WindowsAzure.StorageClient"
                          publicKeyToken="31bf3856ad364e35"
                          culture="neutral" />
        <publisherPolicy apply="no" />
      </dependentAssembly>

    </assemblyBinding>
  </runtime>

По сути, это позволяет переназначить ссылки на v1.1 dll на 1.7.

person Jaime Botero    schedule 01.07.2013