2009-10-21 8 views
1

a. Mon programme C# va charger une DLL (qui est dynamique), pour l'instant prenons a.dll (de même mon programme chargera plus dll comme b.dll, c.dll, etc ....).Impossible de charger la DLL ou l'une de ses dépendances

b. Mon programme appellera une méthode "OnStart" dans a.dll (c'est constant pour toute la DLL).

Je suis capable de réaliser les 2 cas ci-dessus par un mécanisme de réflexion. Le problème est

a. Si mon a.dll a une référence dire xx.dll ou yy.dll, alors quand j'essaye d'invoquer

OnStart méthode de a.dll de mon programme. Je reçois "ne pouvait pas charger dll ou une de ses dépendances". Voir l'extrait de code

Assembly assm = Assembly.LoadFrom(@"C:\Balaji\Test\a.dll"); 

foreach (Type tp in assm.GetTypes()) 
{ 
    if (tp.IsClass) 
    { 
     MethodInfo mi = tp.GetMethod("OnStart"); 

     if (mi != null) 
     { 
      object obj = Activator.CreateInstance(tp); 
      mi.Invoke(obj,null); 
      break; 
     } 
    } 
} 

En général, je reçois une erreur sur la ligne "objet obj = Activator.CreateInstance (tp);" C'est parce que a.dll a une référence de xx.dll, mais dans mon programme, je n'ai pas la référence de xx.dll. Aussi, je ne peux pas avoir la référence de xx.dll dans mon programme car a.dll est un assembly externe et peut avoir toute référence sur son propre.

Aide de Kinldy !!!

Répondre

0

Peut-être que la deuxième référence DLL n'est pas disponible pour votre application?

Assurez-vous que la deuxième DLL se trouve dans le même répertoire que la première DLL ou que l'application est configurée pour rechercher dans un répertoire qui possède la deuxième DLL.

0

Je pense, il faut plus d'explications. Laissez-moi vous expliquer ...

a. Mon programme C# va charger une DLL (qui est dynamique), pour l'instant prenons a.dll (de même plus dll comme b.dll, c.dll, etc ....).

b. Mon programme appellera une méthode "OnStart" (c'est constant pour toute la DLL) dans a.dll.

Je suis capable de réaliser les 2 cas ci-dessus par un mécanisme de réflexion. Le problème est

a. Si mon a.dll a une référence dire xx.dll ou yy.dll, puis quand j'essayer d'invoquer

OnStart méthode de a.dll à partir de mon progra. Je reçois "ne pouvait pas charger dll ou une de ses dépendances".

Voir l'extrait de code

Assembly assm = Assembly.LoadFrom(@"C:\Balaji\Test\a.dll"); 
foreach (Type tp in assm.GetTypes()) 
{ 
    if (tp.IsClass) 
    { 
     MethodInfo mi = tp.GetMethod("OnStart"); 
     if (mi != null) 
     { 
      object obj = Activator.CreateInstance(tp); 
      mi.Invoke(obj,null); 
      break; 
     } 
    } 
} 

En général, je reçois une erreur sur la ligne "objet obj = Activator.CreateInstance (tp);" c'est parce que a.dll a une référence de xx.dll, mais je ne peux pas avoir le même. Aussi, je ne peux pas avoir la référence de xx.dll dans mon programme, car a.dll est dynamique et peut avoir n'importe quelle référence sur son propre.

0

Je pense que vous ne pouvez rien faire d'autre que d'ajouter toutes les références qui sont utilisées. ps: en général, un assemblage externe doit être complet pour l'utilisation (ou le paquet contiendra tous les assemblages nécessaires pour que vous puissiez les ajouter)

1

Jetez un oeil à ceci: http://bytes.com/topic/c-sharp/answers/232691-how-dynamically-load-assembly-w-dependencies. Fondamentalement, dans l'événement AssemblyResolve, vous devez charger les assemblys référencés manuellement.

private Assembly AssemblyResolveHandler(object sender,ResolveEventArgs e) 
{ 
    try 
    { 
     string[] assemblyDetail = e.Name.Split(','); 
     string assemblyBasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
     Assembly assembly = Assembly.LoadFrom(assemblyBasePath + @"\" + assemblyDetail[0] + ".dll"); 
     return assembly; 
    } 
    catch (Exception ex) 
    { 
     throw new ApplicationException("Failed resolving assembly", ex); 
    } 
} 

Pas le meilleur code, mais je voudrais vous donner une idée générale, j'espère. Cependant, je suis d'accord que les plugin-dll doivent être empaquetés pour une utilisation complète sans dépendance. S'ils sont autorisés à charger des assemblages dont vous n'avez pas le contrôle, alors qui sait ce qui pourrait arriver.

Questions connexes