Ниже приведен код для построения кэша, в котором хранятся (typeName, type), найденные в сборках, загруженных в текущий домен приложения.
Я сталкиваюсь с этой странной проблемой при попытке загрузить типы из одной конкретной сборкискажем, сборка. Сборка K насчитывает около 954 типов. Журналы синхронизированы, и все работает хорошо, когда локально размещается в Visual Studio. Кроме того, при развертывании веб-сайта в IIS он хорошо работает при первом вызове buildCache.
Однако, когда пул приложений перезапускается / после его вызова позднее, он запускает вложенный цикл только для5 типов и продолжает выполнение следующей функции, то есть она не выдает никаких исключений и перемещается вперед.
private static void BuildCache()
{
Assembly[] assemblies= AppDomain.CurrentDomain.GetAssemblies();
foreach(Assembly assembly in assemblies){
if(assembly.GlobalAssemblyCache){
if(assemblly.ToString().Contains("assemblyK"))
Logger.Log("GAC");
continue;
}
try
{
if(assembly.ToString().Contains("AssemblyK"))
{
string allTypes = string.Join(",",assembly.GetTypes().Select(x => x.ToString()).ToArray())
Logger.Log("All types :{0}",allTypes);
}
foreach(Type type in assembly.GetTypes())
{
if(assembly.ToString().Contains("AssemblyK"))
{
Logger.Log("Type parsed :{0}",type);
}
if(!typeCache.ContainsKey(type.FullName))
{
if(assembly.ToString().Contains("AssemblyK"))
{
Logger.Log("Adding to cache :{0}",type);
}
typeCache.Add(type.FullName,type);
}
}
catch(Exception ex)
{
Logger.Log("Exception Caught : {0}",ex.ToString());
}
}
}
Примечательно, что AssemblyK.dll собирается в Visual Studio 2008 в. Net 3.5 версия работает все хорошо и при соблюдении в Visual Studio 2019 вызывает проблему. Пул приложений 2.0. И сборка K загружается в «сборки» всегда. Пожалуйста, помогите.
PS: Я скопировал журналы для всех типов, полученных в обоих случаях (когда он работает и не работает), в два файла и произвел сравнение файлов с помощью cmd, с fc file1 file2. Оба содержали одинаковые данные т.е. 954 типа. Итак, мой вопрос, как может foreach работать случайно? В чем может быть проблема здесь?
Обновление: Журналы читаются:
1) В рабочем случае : Все типы: Тип1, Тип2, Тип3, .. Тип954
Тип Parsed954 раза
Добавление в кэш 954 раза
2) В нерабочем случае : все типы: Тип1, Тип2, Тип3, .. Тип954.
Тип Pased 4 раза.
typeCache - это частный статический словарь, доступный только для чтения