我有一个简单的控制台测试应用程序ConsoleApplication1.exe
,它引用了另一个程序集clipper.dll
。
在我测试过的3台机器上,可以将两个文件放在例如c:\test\
,然后执行ConsoleApplication1.exe
。
在另一台恰好是客户端计算机的计算机上,运行ConsoleApplication1.exe
会导致程序崩溃并将以下内容打印到控制台:
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)
这对我来说很奇怪,虽然我不完全理解dll加载规则我认为它会在CWD中搜索指定的文件。事实上,这个相同的设置适用于我尝试过的各种其他计算机也很奇怪。
奇怪的是,如果我删除clipper.dll然后运行它,在工作的计算机上运行:
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)
未处理的异常略有不同,具有完整的程序集名称。
ConsoleApplication1.exe
和clipper.dll
都是为.NET 4构建的。foo.dll
的COM对象(称之为clipper.dll
)时,这些努力就出现了 - 所有这些都在同一个问题机器上。经过几个小时的诅咒后,我能够进一步将它与之隔离开来。答案 0 :(得分:13)
或其中一个依赖项
您是否在该计算机上部署了CRT runtime DLLs?确保部署程序集的Release版本。 CRT的调试版本不可再发行。
答案 1 :(得分:1)
我不知道为什么它会发生在你身上,但如果你将dll复制到system32目录,它将导致2个选项 1)它会工作 2)它不起作用,你会知道它与dll路径无关
答案 2 :(得分:1)
确保在客户端计算机上包含C ++运行时库(CRT)。
答案 3 :(得分:0)
嗯,可能有很多原因
当我试图弄清楚为什么我无法成功利用也引用了clipper.dll的COM对象(也称为foo.dll)时,这些努力就出现了 - 所有这些都在同一个问题机器上。经过几个小时的诅咒后,我能够进一步将它与之隔离开来。
是在故障计算机上注册的COM对象(foo.dll)吗?
请从安装文件夹中删除pdbs。
答案 4 :(得分:0)
您的应用程序文件是否从互联网上下载?我曾经遇到过同样的问题,我的程序是以zip文件的形式下载的,然后在客户端机器上解压缩。一旦提取,我得到完全相同的错误消息“指定的模块不能b e找到了。“
原来是从互联网上下载的文件的Windows安全策略。 Windows将“阻止”下载的文件,并且需要手动解锁。在我的情况下,我需要右键单击该文件,选择属性然后选择“取消阻止”,然后我的应用程序能够正常加载程序集。
http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=mpe&DownloadId=163767
或者,您可以在解压缩之前解锁该zip文件,然后解压缩所有提取的文件。