2010-11-10 12 views
2

J'utilise donc une réflexion pour appeler une fonction d'une DLL sur un lecteur réseau. Le problème est que la DLL nécessite une autre DLL et il est dans ce même dossier, mais une exception est levée.L'utilisation de la réflexion pour appeler une DLL mais une autre DLL requise lance une exception

Voici mon code:

try 
     { 
      Assembly loadedDLL = Assembly.LoadFrom(@"G:\Remote\Debug\BonderControlPanelSim.dll", AppDomain.CurrentDomain.Evidence); 
      Type rtsObj = loadedDLL.GetType("Oe.Te.Ranorex.Instrument.BonderControlPanelSim"); 
      Object obj = Activator.CreateInstance(rtsObj); 

      rtsObj.InvokeMember("Initialize", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj, new object[] { "COM3", 1, 2 }); 
      Thread.Sleep(1500); 
      rtsObj.InvokeMember("PushStart", BindingFlags.InvokeMethod | BindingFlags.Public, null, obj, new object[] { "3" }); 
      Thread.Sleep(200); 
      rtsObj.InvokeMember("Shutdown", BindingFlags.InvokeMethod | BindingFlags.Public, null, obj, null); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 

L'exception que je reçois est la suivante:

{ "Impossible de charger 'SeaMAX.dll' DLL. Le module spécifié est introuvable (Exception HRESULT: 0x8007007E) "}

Le SeaMAX.dll est requis avec le BonderControlPanelSim.dll.

Mon problème est que la DLL est dans le même dossier ... mais ma DLL lorsque la réflexion est utilisée pour invoquer un membre ne peux pas trouver la DLL ... mais c'est là. Ai-je manqué quelque chose

+1

Donc, votre problème est ??? Il semble qu'il ne puisse pas trouver SeaMAX.dll. Est-SeaMAX.dll quelque part. NET devrait être en mesure de le trouver? –

+0

Oui, j'ai mis à jour ma question, mais SeaMAX.dll est dans le même emplacement que le BonderControlPanelSim.dll et BonderControlPanelSim.dll utilise la DLL SeaMAX. –

Répondre

4

Je pense que je connais cette société et ses produits. C'est une DLL non managée, utilisée pour les E/S industrielles. Le problème est que Windows ne peut pas trouver la dépendance, il n'est pas résolu par le chargeur CLR. Vous pouvez l'aider en changeant le répertoire courant:

string oldPath = Environment.CurrentDirectory; 
Environment.CurrentDirectory = @"G:\Remote\Debug"; 
Assembly loadedDLL = Assembly.LoadFrom(...); 
Environment.CurrentDirectory = oldPath; 
// etc.. 

Cela suppose seamax.dll est dans le même répertoire que l'assemblage. Ce n'est normalement pas le cas. Pinvoking SetDllDirectory() est une autre astuce, tout comme la copie de cette DLL dans un répertoire qui se trouve dans la variable d'environnement PATH.

+0

Je pense que j'étais sur le bon chemin ici. Et oui, il est non géré .. La solution n'a pas fonctionné cependant. –

+1

Cela a été couvert par "ce n'est normalement pas". Vous êtes un peu plus près de cette machine que moi. Lire le reste de la publication. –

+0

Oh !! Ça me manque de lire ce que tu as posté. J'ai fait un PInvoke et ça a marché !!! –

0
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool SetDllDirectory(string dllPath); 

SetDllDirectory (@ "G: \ distance \ Debug \");