Загрузка сборки AppDomain вызывает фатальную ошибку механизма выполнения (6B3979C6) (80131506) - PullRequest
0 голосов
/ 14 мая 2009

У нас есть система кеширования типов, чтобы при каждом запуске приложения не выполнять поиск во всех сборках плагинов всех типов, но при переходе с .NET 1.1 на 2.0+ в журнал событий записывается ошибка механизма фатального выполнения ( 6B3979C6) (80131506) в AppDomain.Load ()

Если и только если 1. Домен приложения НЕ является доменом приложения. Домен доменов. 2. Сборка не находится в каталоге исполняемого файла.

Мы разрешаем пользователям предоставлять свои собственные сборки в каталогах, специфичных для проекта, поэтому мы не можем работать вокруг 2.

Я считаю, что 1. нужен, чтобы мы могли выгружать домен приложений после скимминга для типов.

Я не являюсь владельцем этого кода, но могу задать правильные вопросы, если не предоставил достаточно информации.

Этот код вызывает неисправимую ошибку:

    private static void AddAssembly( System.AppDomain appDom, Manifest manifest, string filenameWithoutExtension )
    {
        try
        {
            // Test that the assembly can be loaded...
            System.Reflection.Assembly.ReflectionOnlyLoad(filenameWithoutExtension);

            System.Reflection.Assembly assem = appDom.Load( filenameWithoutExtension );
            ArrayList attributes = new ArrayList();
            //  System.Reflection.Assembly assem = System.Reflection.Assembly.LoadFrom(path+"\\"+file.Name);
            object[] attribs = assem.GetCustomAttributes( typeof(PlugInAttribute), false );
            if ( attribs.Length > 0 )
            {
                attribs = assem.GetCustomAttributes( false );
                foreach ( Attribute attr in attribs )
                {
                    object[] attrAttrs = attr.GetType().GetCustomAttributes(typeof(PlugInAttribute), false );
                    if ( attrAttrs.Length > 0 ) 
                    {
                        attributes.Add(attr.GetType().ToString());
                        break;
                    }
                }
            }
            if ( attribs.Length > 0 || attributes.Count > 0 )
            {
                Assembly assy = new Assembly( manifest );
                manifest.Assemblies.Add(assy);
                assy.Name = filenameWithoutExtension;
                assy.Version = AssemblyName.GetAssemblyName( System.IO.Path.Combine( manifest.Path, filenameWithoutExtension + ".dll") ).Version.ToString();
                assy.Attributes = (ArrayList)attributes.Clone();
                System.Type[] types = assem.GetTypes();
                foreach (System.Type type in types )
                    if ( !type.IsNestedPrivate && !type.IsNestedPublic
                        && !type.IsNestedAssembly  )
                        assy.AddType( type );
            }
        }
        catch ( Exception ex )
        {
            System.Diagnostics.Trace.WriteLine( "Manifest.AddAssembly Exception: " + ex.Message );

            Manager.WriteException(ex);
        }
    }

1 Ответ

0 голосов
/ 14 июня 2009

Это было вызвано сторонней библиотекой лицензирования, которая внедрила в процесс некорректный код.

...