2009-07-10 7 views
3

je exigence suivante,.Net charge de référence lors de l'exécution

  • Je C# /. Net application console, qui se réfère à 'System.Data.Sqlite.dll'
  • « System.Data.Sqlite .dll 'n'est pas enregistré dans GAC (je ne veux pas)
  • Je ne veux pas le conserver dans le répertoire où l'exécutable (.exe) est conservé.

  • Comment puis-je conserver le fichier « System.Data.Sqlite.dll » à un autre répertoire, et le charger en toute sécurité lors de l'exécution, avant son se dans le code référencé demande?

+3

Quel est le problème d'avoir la DLL où le fichier .exe est conservé? – thmsn

+4

Pourquoi ne pouvez-vous pas conserver la DLL dans le répertoire EXE? C'est l'emplacement standard pour une DLL dépendante, et .Net y cherchera sans effort supplémentaire de votre part. – MusiGenesis

+0

S'agit-il d'une application client Windows (formulaires gagnants) ou d'une application Web? – Kane

Répondre

9

Vous pouvez utiliser la résolution d'assemblage manuelle pour ce faire.

Vous devez fournir un délégué à l'événement AssemblyResolve dans le AppDomain actuel

AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.AssemblyResolve += assemblyResolver.ResolveEventHandler; 

lorsque l'application a des références de montage qu'il ne peut pas le résoudre appellera ce délégué pour obtenir l'assemblage résolu. Vous pouvez ensuite retourner simplement l'ensemble demandé au délégué:

Assembly assembly = Assembly.LoadFrom (assemblyPath); 
return assembly; 

this helps

4

Je ne sais pas pourquoi vous voulez le faire à nouveau, c'est un écart par rapport aux meilleures pratiques, mais pour répondre à votre question: Vous pouvez utiliser

Assembly.LoadFrom Method (String path) 

De l'System.Reflection Namespace

& ayant le chemin d'accès au fichier app.config

Assembly.LoadFrom on MSDN

+0

Je ne peux pas ajouter le chemin d'accès au fichier app.config, le répertoire Dll peut changer lors de l'exécution. Une solution de contournement? – Palani

+0

Pourquoi le répertoire dll changerait-il lors de l'exécution? –

+0

@Palani - Pourriez-vous expliquer brièvement votre cas d'utilisation? – abhilash

0

Vous pouvez inclure la DLL dans votre projet EXE en tant que ressource intégrée, et lorsque votre application démarre, vous pouvez enregistrer la DLL dans votre répertoire de fichiers EXE (et le supprimer lorsque l'application se termine, bien que je ne sache pas le problème est d'avoir la DLL dans le répertoire EXE). Cela fonctionnera tant que vous effectuez l'extraction avant de charger tout ce qui fait référence à SqlLite. Mise à jour: puisque vous voulez faire des DLL de style plugin, vous pouvez conserver les DLL dans un répertoire séparé et les copier dans le dossier EXE au démarrage de l'application.

1

Vous pouvez utiliser Assembly.LoadFrom (nom de fichier)

Mais comme commentateurs ont fait remarquer, je ne vois pas pourquoi vous voulez faire?

0

Je ne vois pas la raison d'avoir référencé des assemblages en dehors du fichier exe, mais une façon de le faire est de les placer dans un répertoire séparé sous le répertoire dans lequel se trouve le fichier exe et d'inclure un élément de sondage dans le fichier app.config.

1

Vous devrez charger votre dll et les méthodes utilisant la réflexion (en utilisant System.Reflection espace de noms) en utilisant une combinaison de Assembly.LoadFrom et Type.GetType et Type.GetMethod.

Voici un exemple d'utilisation de la réflexion pour appeler dynamiquement une méthode à partir d'une DLL chargée à l'exécution.

static string DynamicMethodCall(string dllPath, string someClass, string someMethodName, object[] parameters) 
     { 
      Assembly dll = Assembly.LoadFile(dllPath); 

      Type type = dll.GetType(someClass); 

      if (type == null) 
      { 
       Exception ex = new Exception("class not found"); 
       throw ex; 
      } 

      MethodInfo method = type.GetMethod(someMethodName); 

      if (method == null) 
      { 
       Exception ex = new Exception("method not found"); 
       throw ex; 
      } 

      if (parameters.Length >= 1) 
      { 
       object[] myparam = new object[1]; 
       myparam[0] = parameters; 
       return (string)method.Invoke(null, myparam); 
      } 
      else 
      { 
       return (string)method.Invoke(null, null); 
      } 
     } 
4

Vous pouvez ajouter un élément de sondage au fichier de configuration de votre application. Cela permet à d'autres dossiers que ceux par défaut d'être vérifiés pour les bibliothèques requises. Voir here.

Il doit toujours se trouver sous le dossier exe pour des raisons de sécurité.

Questions connexes