Я столкнулся со странной проблемой при запуске веб-ролей. Полное воспроизведение довольно сложное, но мне удалось найти основную причину, поэтому я приведу упрощенные шаги.
Мой проект webrole зависит от AssmeblyA, который, в свою очередь, зависит от AssemblyB, Version=1.0. Веб-роль также напрямую зависит от AssemblyB, но Version=2.0. (все это происходит из разных пакетов NuGet, над которыми я не контролирую).
В итоге AssemblyB, Version=2.0 копируется в папку \Bin. Сам веб-сайт работает правильно, потому что в Web.config есть перенаправление привязки для AssemblyB к версии = 2.0 (которое автоматически помещается туда клиентом nuget).
Однако когда веб-роль развертывается в Azure, она не запускается, так как не удается загрузить AssemblyB версии = 1.0.
Я подозреваю, что это связано с тем, что веб-роль сначала загружается из каталога Approot, где web.config не действует. Я также обнаружил, что могу обойти эту проблему, создав app.config для веб-роли и продублировав там все переадресации привязок. Пока это работает, поддерживать такую настройку не очень удобно.
Кто-нибудь знает, является ли это известной проблемой с веб-ролями Azure?
Пробовал с Azure SDk 2.4 и 2.5.1, все пакеты nuget azure обновлены, никакого пользовательского кода запуска.
Обновление: вот исключение, полученное с помощью IntelliTrace:
Не удалось загрузить точку входа роли из-за следующих исключений: -- System.IO.FileLoadException:
Не удалось загрузить файл или сборку «Microsoft.Owin, версия = 3.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35» или одну из ее зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040) Имя файла: «Microsoft.Owin, версия = 3.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35»
А вот трассировка стека:
CommonLanguageRuntimeLibrary!System.Reflection.RuntimeModule.GetTypes()
CommonLanguageRuntimeLibrary!System.Reflection.Assembly.GetTypes()
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetRoleEntryPoint(System.Reflection.Assembly entryPointAssembly = {System.Reflection.RuntimeAssembly})
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CreateRoleEntryPoint(Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleType roleTypeEnum = IISWeb)
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleType roleTypeEnum = IISWeb)
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRole(Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleType roleType = IISWeb)
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.AnonymousMethod()
CommonLanguageRuntimeLibrary!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext = {unknown}, System.Threading.ContextCallback callback = {unknown}, object state = {unknown}, bool preserveSyncCtx = {unknown})
CommonLanguageRuntimeLibrary!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext = {unknown}, System.Threading.ContextCallback callback = {unknown}, object state = {unknown}, bool preserveSyncCtx = {unknown})
CommonLanguageRuntimeLibrary!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext = {unknown}, System.Threading.ContextCallback callback = {unknown}, object state = {unknown})
CommonLanguageRuntimeLibrary!System.Threading.ThreadHelper.ThreadStart()
Ошибка возникает из-за того, что мой проект веб-роли зависит от версии Owin = 3.0.1.0, но другая DLL (которую я получаю через nuget) зависит от версии Owin = 3.0.0.0. Отсюда явное несоответствие.
Таким образом, похоже, что среда выполнения службы все еще загружает мои сборки в WaIISHost.exe, просто чтобы проверить, есть ли у меня RoleEntryPoint или нет (у меня нет). Как и раньше, как только я кладу myassembly.dll.config со скопированными из web.config привязками редиректов в E:\approot\bin, все запускается корректно.