【发布时间】:2010-12-07 08:40:09
【问题描述】:
我有一个简单的控制台测试应用程序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 构建的。 - 所有机器都安装了 .NET 4 运行时。问题机器没有.NET sdk
- clipper.dll 是非托管 c++ 代码和 C++/CLI 的组合。这是一个可疑的字符,因为它基本上是我创建的第一个 C++/CLI .NET 程序集,并且涉及很多摸索。它似乎可以很好地加载到反射器中。
- 这些努力是在我试图弄清楚为什么我无法成功利用同样引用了
clipper.dll的 COM 对象(称为foo.dll)时做出的——所有这些都在同一台问题机器上。经过几个小时的 regasm 地狱后,我能够进一步将其隔离到此。
【问题讨论】:
-
同时从安装文件夹中删除 pdbs