| Summary: | Проблема с RuntimeType.GetTypeByName в Mono | ||
|---|---|---|---|
| Product: | WINE@Etersoft | Reporter: | Алексей Герасимов <alexger97> |
| Component: | dotNET; .NET; mono | Assignee: | Алексей Герасимов <alexger97> |
| Status: | CLOSED LATER | QA Contact: | Vitaly Lipatov <lav> |
| Severity: | minor | ||
| Priority: | P4 | CC: | lav, mx |
| Version: | unspecified | ||
| Target Milestone: | --- | ||
| Hardware: | PC | ||
| OS: | Linux | ||
| Whiteboard: | |||
| Заявки RT: | Связано с: | ||
| Дата напоминания: | |||
| Bug Depends on: | 14444 | ||
| Bug Blocks: | 14306 | ||
|
Description
Алексей Герасимов
2020-02-12 11:33:14 MSK
Проблема с загрузкой сборки:
Есть участок кода в котором обращаются к определенной сборки.
В начале судя по =+loaddll нужная dll загружается
0009:trace:loaddll:load_native_dll Loaded L"C:\\NALOG3\\InfraCatalog\\AbsFree\\InfraZero\\Bin\\CommonComponents.Infra.Zero.Shared.dll" at 0x9d60000: native
Чуть позже спустя пару шагов программа через System.Configuration обращается в
RuntimeType.GetTypeByName(<>) (Mono)
RuntimeType GetTypeByName(string typeName, bool throwOnError, bool ignoreCase, bool reflectionOnly, ref StackCrawlMark stackMark ..)
Где в теле метода:
*****
var t = internal_from_name (typeName, ref stackMark, null, throwOnError,
ignoreCase, false);
-- падает здесь, переход к if и дальше не происходит
if (throwOnError && t == null)
throw new TypeLoadException ("Error loading '" + typeName + "'");
****
internal_from_name - метод, который к win API.
[MethodImplAttribute(MethodImplOptions.InternalCall)]
static extern RuntimeType internal_from_name (string name, ref StackCrawlMark stackMark, Assembly callerAssembly, bool throwOnError, bool ignoreCase, bool reflectionOnly);
Нашел реализацию :
https://github.com/mono/mono/blob/d9e090e8679b4defdabf4250478f94c4fafacdf0/mono/metadata/icall.c
функция :
MonoReflectionTypeHandle
ves_icall_System_RuntimeTypeHandle_internal_from_name
При работе с =+loaddll видно, что перед падением
Библиотека все же загружается :
0009:trace:loaddll:load_native_dll Loaded L"C:\\NALOG3\\InfraCatalog\\AbsFree\\InfraZero\\Bin\\CommonComponents.Infra.Zero.Security.Shared.dll" at 0x9d80000: native
При работе с WINEDEBUG=warn+all точно перед ошибкой :
0009:warn:ntdll:NtQueryAttributesFile L"\\??\\C:\\NALOG3\\CommonComponents.Infra.Zero.Security.Shared.dll" not found (c0000034)
0009:warn:ntdll:NtQueryAttributesFile L"\\??\\C:\\NALOG3\\CommonComponents.Infra.Zero.Security.Shared.exe" not found (c0000034)
0009:warn:ntdll:NtQueryAttributesFile L"\\??\\C:\\NALOG3\\CommonComponents.Infra.Zero.Security.Shared\\CommonComponents.Infra.Zero.Security.Shared.dll" not found (c000003a)
0009:warn:ntdll:NtQueryAttributesFile L"\\??\\C:\\NALOG3\\CommonComponents.Infra.Zero.Security.Shared\\CommonComponents.Infra.Zero.Security.Shared.exe" not found (c000003a)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\NALOG3\\楗敮匠慴楧杮㐠㈮‰獩愠琠獥楴杮瘠牥楳湯挠湯慴湩湩硥数楲敭瑮污瀠瑡档獥ਮ\\CommonComponents.Infra.Zero.Security.Shared.dll" not found (c000003a)
0009:warn:file:CreateFileW Unable to create file L"C:\\NALOG3\\楗敮匠慴楧杮㐠㈮‰獩愠琠獥楴杮瘠牥楳湯挠湯慴湩湩硥数楲敭瑮污瀠瑡档獥ਮ\\CommonComponents.Infra.Zero.Security.Shared.dll" (status c000003a)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\NALOG3\\CommonComponents.Infra.Zero.Security.Shared.dll" not found (c0000034)
0009:warn:file:CreateFileW Unable to create file L"C:\\NALOG3\\CommonComponents.Infra.Zero.Security.Shared.dll" (status c0000034)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\windows\\mono\\mono-2.0\\lib\\CommonComponents.Infra.Zero.Security.Shared.dll" not found (c0000034)
0009:warn:file:CreateFileW Unable to create file L"C:\\windows\\mono\\mono-2.0\\lib\\CommonComponents.Infra.Zero.Security.Shared.dll" (status c0000034)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\windows\\mono\\mono-2.0\\lib\\mono\\4.5\\Facades\\CommonComponents.Infra.Zero.Security.Shared.dll" not found (c0000034)
0009:warn:file:CreateFileW Unable to create file L"C:\\windows\\mono\\mono-2.0\\lib\\mono\\4.5\\Facades\\CommonComponents.Infra.Zero.Security.Shared.dll" (status c0000034)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\NALOG3\\CommonComponents.Infra.Zero.Security.Shared.exe" not found (c0000034)
0009:warn:file:CreateFileW Unable to create file L"C:\\NALOG3\\CommonComponents.Infra.Zero.Security.Shared.exe" (status c0000034)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\windows\\mono\\mono-2.0\\lib\\CommonComponents.Infra.Zero.Security.Shared.exe" not found (c0000034)
0009:warn:file:CreateFileW Unable to create file L"C:\\windows\\mono\\mono-2.0\\lib\\CommonComponents.Infra.Zero.Security.Shared.exe" (status c0000034)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\windows\\mono\\mono-2.0\\lib\\mono\\4.5\\Facades\\CommonComponents.Infra.Zero.Security.Shared.exe" not found (c0000034)
0009:warn:file:CreateFileW Unable to create file L"C:\\windows\\mono\\mono-2.0\\lib\\mono\\4.5\\Facades\\CommonComponents.Infra.Zero.Security.Shared.exe" (status c0000034)
0009:warn:ntdll:FILE_CreateFile L"\\??\\Z:\\srv\\alexger97\\Projects\\wine\\dlls\\commoncomponents.infra.zero.security.shared\\commoncomponents.infra.zero.security.shared.dll" not found (c000003a)
0009:warn:ntdll:FILE_CreateFile L"\\??\\Z:\\srv\\alexger97\\Projects\\wine\\programs\\commoncomponents.infra.zero.security.shared.dll\\commoncomponents.infra.zero.security.shared.dll" not found (c000003a)
0009:warn:module:find_builtin_dll cannot find builtin library for L"CommonComponents.Infra.Zero.Security.Shared.dll"
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\windows\\mono\\mono-2.0\\lib\\mono\\gac\\policy.7.0.CommonComponents.Infra.Zero.Security.Shared\\0.0.0.0__57bb68e55cad32dd\\policy.7.0.CommonComponents.Infra.Zero.Security.Shared.dll" not found (c000003a)
0009:warn:file:CreateFileW Unable to create file L"C:\\windows\\mono\\mono-2.0\\lib\\mono\\gac\\policy.7.0.CommonComponents.Infra.Zero.Security.Shared\\0.0.0.0__57bb68e55cad32dd\\policy.7.0.CommonComponents.Infra.Zero.Security.Shared.dll" (status c000003a)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\NALOG3\\InfraCatalog\\AbsFree\\InfraZero\\Bin\\CommonComponents.Infra.Zero.Security.Shared.dll.dll" not found (c0000034)
0009:warn:ntdll:FILE_CreateFile L"\\??\\Z:\\srv\\alexger97\\Projects\\wine\\dlls\\commoncomponents.infra.zero.security.shared.dll\\commoncomponents.infra.zero.security.shared.dll.dll" not found (c000003a)
0009:warn:ntdll:FILE_CreateFile L"\\??\\Z:\\srv\\alexger97\\Projects\\wine\\programs\\commoncomponents.infra.zero.security.shared.dll.dll\\commoncomponents.infra.zero.security.shared.dll.dll" not found (c000003a)
0009:warn:module:find_builtin_dll cannot find builtin library for L"CommonComponents.Infra.Zero.Security.Shared.dll.dll"
0009:warn:module:load_dll Failed to load module L"C:\\NALOG3\\InfraCatalog\\AbsFree\\InfraZero\\Bin\\CommonComponents.Infra.Zero.Security.Shared.dll.dll"; status=c0000135
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\NALOG3\\InfraCatalog\\AbsFree\\InfraZero\\Bin\\CommonComponents.Infra.Zero.Security.Shared.dll.dll.la" not found (c0000034)
0009:warn:file:CreateFileW Unable to create file L"C:\\NALOG3\\InfraCatalog\\AbsFree\\InfraZero\\Bin\\CommonComponents.Infra.Zero.Security.Shared.dll.dll.la" (status c0000034)
0009:warn:msvcrt:MSVCRT__wsopen_dispatch :failed-last error (2)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\windows\\mono\\mono-2.0\\lib\\mono\\aot-cache\\x86\\CommonComponents.Infra.Zero.Security.Shared.dll.dll" not found (c000003a)
0009:warn:ntdll:FILE_CreateFile L"\\??\\Z:\\srv\\alexger97\\Projects\\wine\\dlls\\commoncomponents.infra.zero.security.shared.dll\\commoncomponents.infra.zero.security.shared.dll.dll" not found (c000003a)
0009:warn:ntdll:FILE_CreateFile L"\\??\\Z:\\srv\\alexger97\\Projects\\wine\\programs\\commoncomponents.infra.zero.security.shared.dll.dll\\commoncomponents.infra.zero.security.shared.dll.dll" not found (c000003a)
0009:warn:module:find_builtin_dll cannot find builtin library for L"CommonComponents.Infra.Zero.Security.Shared.dll.dll"
0009:warn:module:load_dll Failed to load module L"C:\\windows\\mono\\mono-2.0\\lib/mono/aot-cache/x86/CommonComponents.Infra.Zero.Security.Shared.dll.dll"; status=c0000135
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\windows\\mono\\mono-2.0\\lib\\mono\\aot-cache\\x86\\CommonComponents.Infra.Zero.Security.Shared.dll.dll.la" not found (c000003a)
0009:warn:file:CreateFileW Unable to create file L"C:\\windows\\mono\\mono-2.0\\lib/mono/aot-cache/x86/CommonComponents.Infra.Zero.Security.Shared.dll.dll.la" (status c000003a)
0009:warn:msvcrt:MSVCRT__wsopen_dispatch :failed-last error (3)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\NALOG3\\InfraCatalog\\AbsFree\\InfraZero\\Bin\\CommonComponents.Infra.Zero.Security.Shared.dll.config" not found (c0000034)
0009:warn:file:CreateFileW Unable to create file L"C:\\NALOG3\\InfraCatalog\\AbsFree\\InfraZero\\Bin\\CommonComponents.Infra.Zero.Security.Shared.dll.config" (status c0000034)
0009:warn:msvcrt:MSVCRT__wsopen_dispatch :failed-last error (2)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\windows\\mono\\mono-2.0\\etc\\mono\\assemblies\\CommonComponents.Infra.Zero.Security.Shared\\CommonComponents.Infra.Zero.Security.Shared.config" not found (c000003a)
0009:warn:file:CreateFileW Unable to create file L"C:\\windows\\mono\\mono-2.0\\etc\\mono\\assemblies\\CommonComponents.Infra.Zero.Security.Shared\\CommonComponents.Infra.Zero.Security.Shared.config" (status c000003a)
0009:warn:msvcrt:MSVCRT__wsopen_dispatch :failed-last error (3)
0009:warn:ntdll:FILE_CreateFile L"\\??\\C:\\users\\wine\\.mono\\assemblies\\CommonComponents.Infra.Zero.Security.Shared\\CommonComponents.Infra.Zero.Security.Shared.config" not found (c000003a)
0009:warn:file:CreateFileW Unable to create file L"C:\\users\\wine\\.mono\\assemblies\\CommonComponents.Infra.Zero.Security.Shared\\CommonComponents.Infra.Zero.Security.Shared.config" (status c000003a)
0009:warn:msvcrt:MSVCRT__wsopen_dispatch :failed-last error (3)
$$ Exception! in System.Configuration.TypeUtil.GetType
Получается, что проблема на уровне взаимодействия wine и функции с++ es_icall_System_RuntimeTypeHandle_internal_from_name
Пока на время, исходя из того, что по =+loaddl загружает необходимую dll, а ошибка возникает из-за каких-то побочных, пока не понятных проблем, то попробовал поставить обходную фичу в виде проверки строки загрузки типа на содержание именно проблемной библиотеки и при совпадении менять параметр (bool) throwOnError на false в System.Configuration. Однако это не спасает, вывод о загрузке есть, а функция падает. 0009:trace:loaddll:load_native_dll Loaded L"C:\\NALOG3\\InfraCatalog\\AbsFree\\InfraZero\\Bin\\CommonComponents.Infra.Zero.Security.Shared.dll" at 0x9d80000: native Если поместить данную dll в корень папки, то загрузка происходит спокойно. $$ Enter in else (reflectonly==false) Ok. Before RuntimeTypeHandle.internal_from_name 0009:trace:loaddll:load_native_dll Loaded L"C:\\NALOG3\\CommonComponents.Infra.Zero.Security.Shared.dll" at 0x9d80000: native $$ Make Load!! Type:CommonComponents.Infra.Zero.Security.Authentication.CBAServiceConfigurationSection Если запускать с перемещенной dll, то тогда проблема возникает с её "подругой" CommonComponents.Infra.Zero.Uc [00000009:] EXCEPTION handling: System.IO.FileLoadException: Обнаружено несоответствие ключей сборок [CommonComponents.Infra.Zero.Uc, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null] ╨╕ [CommonComponents.Infra.Zero.Uc, Version=7.0.0.0, Culture=neutral, PublicKeyToken=57bb68e55cad32dd]. [00000009:] EXCEPTION handling: Не удалось найти реализацию стратегии c именем [ClientSoftwareUpdateStrategy] и типом реализации [CommonComponents.Infra.Zero.Uc.Deployment.ClientSoftwareUpdateStrategy, CommonComponents.Infra.Zero.Uc] (C:\NALOG3\InfraCatalog\AbsFree\InfraZero\Configuration\UcLoaderEnvi.config) Пробовал найти откуда берется добавление " .. Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" но не нашел. 1. Смотрел документацию на mono runtime чтобы понять как и во что собирается само ядро CLI.
Для того, чтобы начать отладку функции на c++ добавил туда пока просто небольшой вывод printf("..");
2. Занимался тем, чтобы обойти проблему загрузки типов из двух(возможно 3) библиотек из InfraCatalog/AbsFree/InfraZero/Bin
CommonComponents.Infra.Zero.Security.Shared
CommonComponents.Infra.Zero.Uc
CommonComponents.Infra.Zero.Security.Client
Стоит сказать, что на момент обращения к загрузке данных библиотек в домене уже находится 88(!) библиотек.
Также не помню упоминал ли о том, что в них содержится часть данных по работе с kerberos, что обнаружил вчера.
Логично было бы посмотреть не локальная ли эта проблема для этих библиотек, ведь пока таких проблем не было. Решил написать обходной путь получения типа, чтобы закрыть проблему и посмотреть будет ли повторяться проблема для других библиотек.
Путь был выбран такой : загрузить в домен библиотеку, а затем вытащить оттуда тип.
Для этого в проект в Etersoft.Mono.Extentions добавил класс GetType с статическим методом TryGetType, который реализует загрузку сначала библиотеки и типа. Это другая логика, так как используется жесткая привязка по пути загрузки.
Более подробно логика видна в репозитории.
Далее в System.Configuration.TypeUtil.GetType(), в котором происходил запрос типа используя старый маршрут, теперь при получении типа из "проблемной библиотеки" происходит обращение к прокладке, где и запрашивается тип по новой схеме.
Так удалось решить проблему по CommonComponents.Infra.Zero.Security.Shared.
Однако при запросе очередной конфигурационной секции происходит ошибка загрузки CommonComponents.Infra.Zero.Uc. Это связано с другой цепочкой вызовов, которые приводят в RuntimeType GetTypeByName().
Пока не раскопал всю цепочку, а добавлять ссылку на прокладку на уровне mscorlib не хочется. Вскоре решу, найдя запрос Type в System.Configuration
Мои внедрения кода, помогли полностью загрузить необходимые dll из папки InfraCatalog/AbsFree/InfraZero/Bin. Однако далее встала проблема с тем, что при обращении к вызову типа CommonComponents.Infra.Security.SetWindowsPrincipalStrategy из папки InfraCatalog/AbsFree/InfraCommon/Bin библиотеки CommonComponents.Infra.Security.Common.dll произошла та же самая ошибка. Пойдя уже по знакомому пути: доработки механизма загрузки dll путем использования Assembly.LoadFrom(<жесткий путь к файлу.dll>) и далее к загрузки типа из нее, столкнулся с тем, что отработанная схема, не работает. Также скажу, что на момент загрузке в домене 91 библиотека. Данный вывод приходит из "прокладки" ##!Eter.Mono.Ext System.IO.FileNotFoundException: Invalid Image File name: '/net/wine/bottles/dotnet/.wine-Mono-6.6/drive_c/NALOG3/InfraCatalog/AbsFree/InfraCommon/Bin/CommonComponents.Infra.Security.Common.dll' Много раз проверив то, что все написано так, чтобы все работало без погрешностей, решил вынести данную задачу в тестовую программу. https://gitlab.eterfund.ru/gnivc/Mono_Nalog_Test/tree/master/LoadTypeTest/bin/Debug Данный тест работает в window c Framework. Данный тест завершается ошибкой (как и выше) при работе в mono (пробовал даже с System.Configuration из Framework). Стоит сказать, что пытаясь выяснить последнюю функцию, в которой программа работала до ошибки, выяснил, что при --trace=N:System.Reflection Последние пара функций перед ошибкой: [00000009: 34,23114 5] ENTER: System.Reflection.AssemblyName:get_Version ()(this:00A0DB20[System.Reflection.AssemblyName CommonComponents.UnifiedClient.exe], ) [00000009: 34,23129 5] LEAVE: System.Reflection.AssemblyName:get_Version ()[System.Version:00A0DC78] [00000009: 34,23143 5] ENTER: System.Reflection.AssemblyName:get_Version ()(this:00A0DB20[System.Reflection.AssemblyName CommonComponents.UnifiedClient.exe], ) [00000009: 34,23161 5] LEAVE: System.Reflection.AssemblyName:get_Version ()[System.Version:00A0DC78] [00000009: 34,23177 5] ENTER: System.Reflection.AssemblyName:InternalGetPublicKeyToken ()(this:00A0DB20[System.Reflection.AssemblyName CommonComponents.UnifiedClient.exe], ) [00000009: 34,23191 5] LEAVE: System.Reflection.AssemblyName:InternalGetPublicKeyToken ()[System.Byte[]:00A0DE40] [00000009: 34,23206 5] ENTER: System.Reflection.AssemblyName:get_Flags ()(this:00A0DB20[System.Reflection.AssemblyName CommonComponents.UnifiedClient.exe], ) [00000009: 34,23220 5] LEAVE: System.Reflection.AssemblyName:get_Flags ()result=1 [00000009: 34,23235 4] LEAVE: System.Reflection.AssemblyName:get_FullName ()[STRING:00A0E520:CommonComponents.Infra.Zero.Uc, Version=7.0.0.0, Culture=neutral, PublicKeyToken=57bb68e55cad32dd] Далее происходит исключение. Посмотрев под декомпилятором System.Reflection.AssemblyName:get_FullName в mscorlib видно, что происходит формирование имени, включаю версию, культуру и ключ. Также очень странное поведение при работы с --trace=N:System.Reflection : программа работает и получает тип. При отсутствии программа падает. Очень странно : раньше при запуске через ww (wine) и через ww mono.exe <программа> на winestaging разницы хода выполнения не наблюдал. Теперь же на тесте через ww (wine) разницы выполнения нет, что ожидаемо, а при запуске через ww mono.exe тестовая программа падает. Добавил тестовый вывод в System.Reflection.AssemblyName:get_FullName. Надо еще раз все проанализировать и найти объяснение. Результаты для размышления. Добавил вывод AssemblyName.FullName:get В том числе в конце перед return проверяю, что возвращает. Стало видно, что почти сразу есть два обращения к полному имени, причем в первый раз при выходе : $$ return stringBuilder.ToString(); CommonComponents.Infra.Zero.Uc, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null Второй : $$ return stringBuilder.ToString(); CommonComponents.Infra.Zero.Uc, Version=7.0.0.0, Culture=neutral, PublicKeyToken=57bb68e55cad32dd Стало большой загадкой почему процесс именно так. Добавил на экран вывод stacktrace при переходе в данную функцию. at System.Environment.get_StackTrace () [0x00000] in <d68b9accd7c7479a89d9a85470a20582>:0 at System.Reflection.AssemblyName.get_FullName () [0x00000] in <d68b9accd7c7479a89d9a85470a20582>:0 at CommonComponents.Hosting.AssemblyCache.CheckAssemblyAndThrow (System.Reflection.AssemblyName requiredAssemblyName, System.Reflection.AssemblyName knownAssemblyName) [0x00000] in <c04862bf6e784ac2969157a7bb51e880>:0 at CommonComponents.Hosting.AssemblyCache.ResolveAssembly (System.ResolveEventArgs args) [0x00000] in <c04862bf6e784ac2969157a7bb51e880>:0 at CommonComponents.Hosting.AssemblyCache.CurrentDomainOnAssemblyResolve (System.Object sender, System.ResolveEventArgs args) [0x00000] in <c04862bf6e784ac2969157a7bb51e880>:0 at System.AppDomain.DoAssemblyResolve (System.String name, System.Reflection.Assembly requestingAssembly, System.Boolean refonly) [0x00000] in <d68b9accd7c7479a89d9a85470a20582>:0 at System.RuntimeTypeHandle.internal_from_name (System.String , System.Threading.StackCrawlMark& , System.Reflection.Assembly , System.Boolean , System.Boolean , System.Boolean ) [0x00000] in <d68b9accd7c7479a89d9a85470a20582>:0 at System.RuntimeTypeHandle.GetTypeByName (System.String typeName, System.Boolean throwOnError, System.Boolean ignoreCase, System.Boolean reflectionOnly, System.Threading.StackCrawlMark& stackMark, System.Boolean loadTypeFromPartialName) [0x00000] in <d68b9accd7c7479a89d9a85470a20582>:0 at System.RuntimeType.GetType (System.String typeName, System.Boolean throwOnError, System.Boolean ignoreCase, System.Boolean reflectionOnly, System.Threading.StackCrawlMark& stackMark) [0x00000] in <d68b9accd7c7479a89d9a85470a20582>:0 at System.Type.GetType (System.String typeName) [0x00000] in <d68b9accd7c7479a89d9a85470a20582>:0 at CommonComponents.Shared.StrategyChainBuilder.BuildUpStrategy (CommonComponents.Shared.StrategySettings settings, System.Func`2[T,TResult] byNameFactory) [0x00000] in <110252a4bb55414a89ce0bf6996895af>:0 Видно, что при загрузке type из функции (про нее выше) ves_icall_System_RuntimeTypeHandle_internal_from_name идет вызов в System.AppDomain.DoAssemblyResolve . Как я понял это есть обработчик на событие : https://docs.microsoft.com/ru-ru/dotnet/standard/assembly/resolve-loads А далее в CommonComponents.Hosting.AssemblyCache.CheckAssemblyAndThrow, код которого приведу ниже, происходит ошибка,вывод о которой видели раньше. private static void CheckAssemblyAndThrow(AssemblyName requiredAssemblyName, AssemblyName knownAssemblyName) { if (!AssemblyCache.CheckPublicKeyToken(requiredAssemblyName.GetPublicKeyToken(), knownAssemblyName.GetPublicKeyToken())) { throw new FileLoadException(string.Format("Обнаружено несоответствие ключей сборок [{0}] и [{1}].", requiredAssemblyName.FullName, knownAssemblyName.FullName)); } ........ } очевидно, что AssemblyCache.CheckPublicKeyToken(requiredAssemblyName.GetPublicKeyToken(), knownAssemblyName.GetPublicKeyToken() == false для данной ситуации. private static bool CheckPublicKeyToken(byte[] required, byte[] known) { bool flag = required == null; bool knownIsNull = known == null; return flag || (!knownIsNull && ((IStructuralEquatable)required).Equals(known, StructuralComparisons.StructuralEqualityComparer)); } Попытки изменить dll, добавив вывод для отладки, ведут только к тому ,что программа дает исключение при обращении в функции CheckPublicKeyToken к массиву required. Пока трудно сказать в чем именно проблема, но все это довольно интересно Оставлю для себя ссылку на mono функцию по получению fullname, по ней были вопросы в другой ситуации. https://github.com/mono/mono/blob/d9e090e8679b4defdabf4250478f94c4fafacdf0/mono/metadata/icall.c ves_icall_System_Reflection_RuntimeAssembly_get_fullname Нашел проблему. В CheckPublicKeyToken () на выход в Mono и Framework выдает разный результат. Не сразу получилось уловить в чем проблема, так как при добавлении строк вывода и разделении логики выполнения на подуровни не учел особенностей приведения null. Проблема в том, что на вход в функцию подавалось первым аргументом: В framework - null; В mono - массив byte[0]. Корень данной проблемы лежит в том, в CommonComponents.HostingCurrentDomain.OnAssemblyResolve - обработчике на событие загрузки библиотеки в домен (System.AppDomain.DoAssemblyResolve (его аналога в mono)) приходили от es_icall_System_RuntimeTypeHandle_internal_from_name аргументы, в которых ResolveEventArgs args.Name было CommonComponents.Infra.Zero.Uc, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null. На основе этих данных и создавался новый экземпляр AssemblyName, а затем проверялся с тем, который получался в функции загрузки библиотеки по строгому пути. Т.е то, что получалось от события в неуправляемой функции Type.GetType() сравнивалось с Assembly.Load.Name. Была написана небольшая тестовая программа, которая содержала обработчик события на загрузку dll. При одинаковых условиях в framework и mono в обработчик приходила разная информация в args.Name. Причина поведения была выяснена. Далее чуть изменив мои mscorlib c перенаправлением на Etersoft.Mono.Extentions.dll были загружены те сборки, при загрузке которых возникала ошибка. Программа прошла дальше. На данный момент проблема при выполнении в CommonComponents.Shared.StrategyChainService.ExecuteStrategies . [00000009:] EXCEPTION handling: System.NullReferenceException: Object reference not set to an instance of an object [00000009:] EXCEPTION handling: CommonComponents.Shared.StrategyChainExecuteException: Strategy chain execution failed. (Strategy type ClientSoftwareUpdateStrategy, index 7) [00000009:] EXCEPTION handling: CommonComponents.Shared.StrategyChainExecuteException: Strategy chain execution failed. (Strategy type ClientSoftwareUpdateStrategy, index 7) [00000009:] EXCEPTION handling: CommonComponents.Shared.StrategyChainExecuteException: Strategy chain execution failed. (Strategy type InitializeChildHostLoaderEnviStrategy, index 1) [00000009:] EXCEPTION handling: CommonComponents.Shared.StrategyChainExecuteException: Strategy chain execution failed. (Strategy type InitializeChildHostLoaderEnviStrategy, index 1) Изучал возможности отладки неуправляемого кода из-за большого объема все возможных вариантов появления данной проблемной части строчки с описанием загружаемой библиотеки. Удалось наконец-то наладить сборку и работу с mono в оффисе, также прорабатывал некоторые другие моменты, о которых напишу потом Бага закрыта Бага закрыта |