У нас есть система кеширования типов, чтобы при каждом запуске приложения не выполнять поиск во всех сборках плагинов всех типов, но при переходе с .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);
}
}