2010-12-07 28 views
4

J'ai une application de test de console simple, ConsoleApplication1.exe, qui fait référence à un autre assemblage clipper.dll.Pourquoi mon application ne trouve-t-elle pas une DLL dépendante dans le même répertoire?

Sur 3 machines sur lesquelles j'ai testé, il est possible de placer les deux fichiers par ex. c:\test\ et exécutez ConsoleApplication1.exe.

Sur une autre machine, qui se trouve être une machine cliente, en cours d'exécution ConsoleApplication1.exe résultats dans un accident de programme et ce qui suit en cours d'impression à la console:

C:\test>dir 
Volume in drive C has no label. 
Volume Serial Number is 7C46-414F 

Directory of C:\test 

07/12/2010 06:08 PM <DIR>   . 
07/12/2010 06:08 PM <DIR>   .. 
07/12/2010 05:13 PM   11,776 ClassLibrary1.dll 
07/12/2010 05:13 PM   30,208 ClassLibrary1.pdb 
07/12/2010 04:55 PM    3,572 ClassLibrary1.tlb 
19/11/2010 02:46 PM   235,008 clipper.dll 
19/11/2010 02:46 PM   1,534,976 clipper.pdb 
07/12/2010 05:13 PM    6,144 ConsoleApplication1.exe 
07/12/2010 05:13 PM   11,776 ConsoleApplication1.pdb 
01/08/2010 12:52 PM   139,264 nunit.core.dll 
01/08/2010 06:41 AM   57,344 nunit.core.interfaces.dll 
01/08/2010 06:41 AM   135,168 nunit.framework.dll 
01/08/2010 06:41 AM   547,262 nunit.framework.xml 
       11 File(s)  2,712,498 bytes 
       2 Dir(s) 477,821,784,064 bytes free 

C:\test>ConsoleApplication1.exe 

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or ass 
embly 'clipper.dll' or one of its dependencies. The specified module could not b 
e found. 
    at ConsoleApplication1.Program.Main(String[] args) 

Ceci est un moi étrange, bien que je don Je ne comprends pas les règles de chargement dll complètement, je pensais qu'il chercherait le CWD pour le fichier spécifié. Et le fait que cette même configuration fonctionne sur les différents autres ordinateurs que j'ai essayés est également étrange.

Chose curieuse, sur un ordinateur de travail si je retire clipper.dll puis exécutez:

C:\Temp>ConsoleApplication1.exe 

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or ass 
embly 'clipper, Version=1.0.3975.26584, Culture=neutral, PublicKeyToken=null' or 
one of its dependencies. The system cannot find the file specified. 
    at ConsoleApplication1.Program.Main(String[] args) 

L'exception non gérée est légèrement différente, avec un nom de montage complet.

  • Les deux ConsoleApplication1.exe et clipper.dll sont construits pour 4. .NET
  • Toutes les machines ont le runtime .NET 4 installé. La machine de problème n'a pas le .NET sdk
  • clipper.dll est une combinaison de code C++ ummanaged et C++/CLI. C'est un caractère suspect car c'est en fait le premier assemblage C++/CLI .NET que j'ai créé et beaucoup de tâtonnements. Il semble charger dans le réflecteur bien.
  • Ces efforts sont venus lorsque j'ai essayé de comprendre pourquoi je ne pouvais pas utiliser avec succès un objet COM (appelez-le foo.dll) qui a également référencé clipper.dll - tous également sur le même ordinateur à problème. Après plusieurs heures d'enfer de regasme, j'ai pu l'isoler davantage.
+0

également supprimer pdbs à partir du dossier d'installation – TalentTuner

Répondre

10

ou une de ses dépendances

Avez-vous Déployez le CRT runtime DLLs sur cette machine? Assurez-vous de déployer la version Release de votre assembly. La version de débogage du CRT n'est pas redistribuable.

+0

Je ne comprends pas «redistribuable». Microsoft utilise souvent le terme dans leur page de téléchargement. Qu'Est-ce que c'est? Quelle est la différence 'paquet redistribuable' et 'paquet non redistribuable'. Donnez-moi un indice s'il vous plaît. – Benjamin

+2

@Ben - vous ne pouvez pas donner une copie d'un fichier ayant un droit d'auteur Microsoft à quelqu'un d'autre à moins que Microsoft ne vous en donne l'autorisation. Le fichier redist.txt du répertoire d'installation de VS répertorie les fichiers que vous pouvez redistribuer. –

+0

C'est facile! Merci. – Benjamin

1

Je ne sais pas pourquoi il happed à u, mais si vous copiez le dll dans le répertoire system32 cela conduira à 2 options 1) Il travaillera 2) Il ne fonctionnera pas et de cette façon vous saurez qu'il ne porte pas sur le chemin dll

0

Eh bien, il peut y avoir beaucoup de raisons

Ces efforts ont quand je tentais de comprendre pourquoi je ne pouvais pas utiliser avec succès une COM objet (appelez-le foo.dll) qui a également référencé clipper.dll - tous également sur le même ordinateur problème. Après plusieurs heures d'enfer de regasme, j'ai pu l'isoler davantage.

est l'objet COM (foo.dll) enregistré sur l'ordinateur en difficulté?

Retirez également les fichiers PDF du dossier d'installation.

0

Vos fichiers d'application sont-ils téléchargés sur Internet? J'ai déjà eu le même problème où mon programme a été téléchargé dans un fichier zip, puis extrait sur la machine client. Une fois extrait, j'obtenais exactement le même message d'erreur "Le module spécifié ne pouvait pas trouver trouvé."

Il s'est avéré être la politique de sécurité de Windows pour les fichiers téléchargés à partir d'Internet. Windows va "bloquer" les fichiers téléchargés, et ils doivent être débloqués manuellement. Dans mon cas, j'avais besoin de faire un clic droit sur le fichier, sélectionner les propriétés et ensuite sélectionner "débloquer", mon application était alors capable de charger l'assemblage normalement.

http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=mpe&DownloadId=163767

Sinon, vous pouvez débloquer le fichier zip avant de l'extraire, puis tous les fichiers extraits seront également débloquées.

1

Veillez à inclure les bibliothèques d'exécution C++ (CRT) sur votre ordinateur client.