2011-11-11 1 views
3

J'ai un code comme celui-ciImpossible de charger le fichier ou l'assemblage ou l'une de ses dépendances. Le système ne peut pas trouver le fichier spécifié

public static Type ToType(XmlSerializableType xmlSerializableType) 
{ 
    string func = "XmlSerialzationType.ToType"; 
    Type type = null; 
    if (xmlSerializableType != null && xmlSerializableType.Name != string.Empty) 
    { 
    type = Type.GetType(xmlSerializableType.Name); 
    if (type == null) 
    { 
     // May be a user defined class 
     try 
     { 
     Assembly assembly = Assembly.Load(xmlSerializableType.AssemblyName); 
     type = assembly.GetType(xmlSerializableType.Name); 
     } 
     catch (Exception ex) 
     { 
     TestDebug.DebugTraceSevere(func, "Exception " + ex.ToString()); 
     } 
    } 
    } 
    return type; 
} 

J'ai une classe de base nommée « feuille » et un userdefinedclass nommé « roundedtree » quand « xmlSerializableType.Name » devient classe USERDEFINED « _rounded_tree », la première fois que je reçois la valeur pour 'assemblage as _rounded_treeGOLD, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' a nd ainsi pour' type as {Name = "_rounded_tree" FullName = "_rounded_tree"} '. Mais après avoir sauvegardé si je redémarre mon application je ne peux pas charger la valeur 'assemblage' en obtenant l'exception 'Impossible de charger le fichier ou l'assemblage' _rounded_treeGOLD, Version = 0.0.0.0, Culture = neutre, PublicKeyToken = null 'ou l'une de ses dépendances. Le système ne peut pas trouver le fichier spécifié. ":" _ Rounded_treeGOLD, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null 'et retrouver le type devient nul cela ne devrait pas se produire

Pour baseclass pas "feuille" issuses i sera get xmlSerializableType.Name comme "Root.Systemmodel.leaf" et "type" devient {Name = "leaf" FullName = "Root.Systemmodel.leaf"} l'assemblage sera Root.Systemmodel, Version = 8.0.7.0, Culture = neutre, PublicKeyToken = 83bd062a94e26d58 que dois-je faire dans ces circonstances Ceci est un morceau de code qui va générer l'ensemble pour la classe UserDefined

public Type CreateType() 
     { 
     string func = "ManagedClass.CreateType"; 

     // Create instances of AssemblyBuilder and ModuleBuilder for the new Type 
     AppDomain myDomain = Thread.GetDomain(); 
     AssemblyName myAsmName = new AssemblyName(); 

     // Create the assembly name by appending the machine name to the typename. 
     myAsmName.Name = this.TypeName + Environment.MachineName; 
     // Define assembly that can be executed but not saved 
     this.UserClassAssemblyBuilder = myDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.Run); 
     // Create dynamic module with symbol information 
     this.UserClassModuleBuilder = this.UserClassAssemblyBuilder.DefineDynamicModule("userdefinedmodule", true); 

MISE À JOUR

probablement mon assemblage crée pour la classe définie par l'utilisateur, mais ne sauve pas que peut-être la raison pour laquelle je ne suis pas face à toute question première fois, une fois que je ferme l'application, je vais perdre que l'on voir mon code

// Define assembly that can be executed but not saved 
     this.UserClassAssemblyBuilder = myDomain.DefineDynamicAssembly(myAsmName, 

AssemblyBuilderAccess.Run); comment surmonter cette situation

MISE à JOUR Voici ma base de données est fichiers xml. Quand j'ai vérifié la feuille de classe de base, je peux voir l'entrée est <Name>Root.Systemmodel.WindowsSystem</Name><AssemblyName>Root.Systemmodel, Version=8.0.7.0, Culture=neutral, PublicKeyToken=83bd062a94e26d58</AssemblyName> dans ce cas si redémarrer mon application pas de problèmes, mais pour la classe définie par l'utilisateur "roundedtree" entrée xml est <Name>_rounded_tree</Name> <AssemblyName>_rounded_treeGOLD, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</AssemblyName> Ici la première fois pas de problèmes, mais si je redémarre mon application je Je reçois l'exception

+0

Peut-être utile: http://stackoverflow.com/questions/408002/could-not-load-file-or-assembly-xxxx-or-one-of-its-dependencies-the-system-ca, http: //stackoverflow.com/questions/1246853/could-not-load-file-or-assembly-app-code-or-one-of-its-dependencies, http://stackoverflow.com/questions/4576221/could- non-load-file-or-assembly-xxx-yyy-ou-de-ses-dépendances-the-syste, http://stackoverflow.com/questions/5004514/could-not-load-file-or- assembly-or-one-of-its-dependencies-the-system-can-f, (à suivre ...) –

+0

et: http://stackoverflow.com/questions/1504835/yet-another-could-not -load-file-or-assembly-ou-de-unes-de-ses-dépendances-le, http: // stackoverflow.com/questions/1479803/c-sharp-could-not-charger-fichier-ou-assembly-system-ne peut pas-trouver-fichier-spécifié, http://stackoverflow.com/questions/4469929/could-not-load- file-or-assembly-or-one-of-its-dependencies, http://stackoverflow.com/questions/6993563/wcf-could-not-load-file-or-assembly-the-system-cannot-find- the-file-specifi, http://stackoverflow.com/questions/1265505/sharepoint-could-not-load-file-or-assembly-the-system-cannot-find-the-file-sp, etc. –

+1

Vous tous les lire? –

Répondre

6

il se produit parce que peut-être l'assembly que vous allez charger des références à un autre assembly qui n'existent pas dans le même répertoire ou le répertoire système mettre tout l'assembly dans le même dossier. son clair

private string asmBase; 
public Type[] GetAllTypeinAssembly(string assemblyName) 
{ 
    asmBase = System.IO.Path.GetDirectoryName(assemblyName); 

    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
    System.Reflection.Assembly asm = System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(assemblyName));//domain.Load(bt) ;// 

    return asm.GetTypes(); 
} 


private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    //This handler is called only when the common language runtime tries to bind to the assembly and fails. 

    //Retrieve the list of referenced assemblies in an array of AssemblyName. 
    Assembly MyAssembly, objExecutingAssemblies; 
    string strTempAssmbPath = ""; 
    objExecutingAssemblies = args.RequestingAssembly; 
    AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies(); 

    //Loop through the array of referenced assembly names. 
    foreach (AssemblyName strAssmbName in arrReferencedAssmbNames) 
    { 
     //Check for the assembly names that have raised the "AssemblyResolve" event. 
     if (strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) == args.Name.Substring(0, args.Name.IndexOf(","))) 
     { 
      //Build the path of the assembly from where it has to be loaded.     
      strTempAssmbPath = asmBase + "\\" + args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll"; 
      break; 
     } 

    } 
    //Load the assembly from the specified path.      
    MyAssembly = Assembly.LoadFrom(strTempAssmbPath); 

    //Return the loaded assembly. 
    return MyAssembly; 
} 
+0

Ok Je mets une partie du code que j'ai utilisé auparavant pour faire cela – DeveloperX

+0

add gestionnaire d'événements assemblyresolve – DeveloperX

+0

Cet assembly existe-t-il dans le même fodler, donc oui – DeveloperX

0

J'ai eu le même problème, si vous travaillez sur SharePoint, parfois le refere nces peut ne pas être regroupé dans WSP, de sorte que, lors du déploiement, ces DLL référencées ne seront pas déployées. La résolution consiste à les faire manuellement à partir du GAC ou à les forcer dans les WSP ou à les copier dans la corbeille locale. Le dernier a résolu pour moi.

+0

Qu'est-ce que SharePoint a à voir avec la question? C'est une question de winforms. –

Questions connexes