2009-05-13 6 views
0

Nous avons un système de cache de type en place pour éviter de rechercher tous les assemblys de plug-ins pour tous les types à chaque démarrage de l'application, mais lors du déplacement .NET 1.1 à 2.0+, le journal des événements enregistre une exécution erreur fatale du moteur (6B3979C6) (80131506) sur le AppDomain.Load()La charge de l'assembly AppDomain provoque une erreur Fatal Execution Engine (6B3979C6) (80131506)

Si et ne si 1. AppDomain est pas AppDomain.CurrentDomain. 2. L'assembly ne se trouve pas dans le répertoire de l'exécutable.

Nous permettons aux utilisateurs de fournir leurs propres assemblées dans des répertoires spécifiques au projet, donc nous ne pouvons pas travailler autour 2.

Je crois 1. est voulu que nous puissions décharger le AppDomain à après écrémage pour les types.

Je ne suis pas le propriétaire de ce code, mais je peux poser les bonnes questions si je n'ai pas fourni assez d'informations.

Ce code provoque l'erreur uncatchable:

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); 
     } 
    } 

Répondre

0

Cela était dû à une bibliothèque de licence tiers qui a injecté du code bogué dans le processus.

Questions connexes