Bug 14426

Summary: Проблема с RuntimeType.GetTypeByName в Mono
Product: WINE@Etersoft Reporter: Алексей Герасимов <alexger97>
Component: dotNET; .NET; monoAssignee: Алексей Герасимов <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
Проблема при загрузке типа CommonComponents.Infra.Zero.Security.Shared


00000009:] EXCEPTION handling: System.IO.FileLoadException: Обнаружено несоответствие ключей сборок [CommonComponents.Infra.Zero.Security.Shared, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null] ╨╕ [CommonComponents.Infra.Zero.Security.Shared, Version=7.0.0.0, Culture=neutral, PublicKeyToken=57bb68e55cad32dd].
[00000009:] EXCEPTION handling: System.TypeLoadException: Could not load type 'CommonComponents.Infra.Zero.Security.Authentication.CBAServiceConfigurationSection' from assembly 'CommonComponents.Infra.Zero.Security.Shared, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
[00000009:] EXCEPTION handling: System.TypeLoadException: Could not load type 'CommonComponents.Infra.Zero.Security.Authentication.CBAServiceConfigurationSection' from assembly 'CommonComponents.Infra.Zero.Security.Shared, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
Comment 1 Алексей Герасимов 2020-02-12 11:44:18 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
Comment 2 Алексей Герасимов 2020-02-12 18:01:42 MSK
Пока на время, исходя из того, что по =+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" но не нашел.
Comment 3 Алексей Герасимов 2020-02-13 16:58:43 MSK
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
Comment 4 Алексей Герасимов 2020-02-14 16:25:22 MSK
Мои внедрения кода, помогли полностью загрузить необходимые 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 : программа работает и получает тип.  При отсутствии программа падает.
Comment 5 Алексей Герасимов 2020-02-14 16:53:58 MSK
Очень странно : раньше при запуске через ww (wine) и через ww mono.exe <программа> на winestaging разницы хода выполнения не наблюдал. 

Теперь же на тесте через ww (wine) разницы выполнения нет, что ожидаемо, а при запуске через ww mono.exe тестовая программа падает.

Добавил тестовый вывод в  System.Reflection.AssemblyName:get_FullName.
Надо еще раз все проанализировать и найти объяснение.
Comment 6 Алексей Герасимов 2020-02-17 17:49:24 MSK
Результаты для размышления. 
Добавил вывод 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
Comment 7 Алексей Герасимов 2020-02-18 16:43:27 MSK
Нашел проблему.

В 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)
Comment 8 Алексей Герасимов 2020-04-27 21:07:03 MSK
Изучал возможности отладки неуправляемого кода из-за большого объема все возможных вариантов появления  данной  проблемной части строчки с описанием загружаемой библиотеки.  Удалось наконец-то наладить сборку и работу с mono в оффисе, также прорабатывал некоторые другие моменты, о которых напишу потом
Comment 9 Михаил Михайлов 2025-10-15 18:45:20 MSK
Бага закрыта
Comment 10 Михаил Михайлов 2025-10-15 18:45:32 MSK
Бага закрыта