8

在 Visual Studio 2008 中,我添加了 WinScp.dll(在项目根目录中)作为参考,并且立即出现了一个黄色图标。在编译时:

  • 找不到类型或命名空间名称“WinSCP”(您是否缺少 using 指令或程序集引用?)
  • 已解决的文件有错误的图像、没有元数据或无法访问。无法加载文件或程序集“E:...\winscp.exe”或其依赖项之一。该模块应包含程序集清单。

经过一个小时的挫折,我发现如果我将 WinSCP.exe 作为项目文件(也在项目根目录中)删除,一切都编译得很好。奇怪的!!!!

问题是我的输出目录中同时需要 WinSCP.dll 和 WinSCP.exe。我该怎么办?

编辑:我知道有一些解决方法,例如重命名文件或更改路径。我一开始重命名了exe;现在我重命名了 dll(感谢@Michael),因为它不需要我在我的代码中指定重命名的 exe。

但为什么首先会出现问题?WinSCP.dll 和 WinSCP.exe 是两个不同的文件。这是 Visual Studio 中的错误,还是我不理解的错综复杂的 dll/exe?

4

1 回答 1

7

WinSCP.dll 和 WinSCP.exe 是两个不同的文件

不是程序集加载器,它不注意文件扩展名。它只知道它需要找到显示名称为“winscp”的程序集。搜索匹配项时,它首先尝试使用该名称的 EXE 文件,然后是 DLL 文件。您可以使用 Fuslogvw.exe 实用程序看到的内容。使用 Fusion 组件的 Microsoft 人员在这篇文中描述了显示名称:

“名称”部分通常是程序集的文件名,不包括扩展名. 所以对于程序集 foo.dll,“名称”部分是“foo”。当然,由于我说的是“通常”,所以有时“名称”部分与不包括扩展名的文件名不同。我稍后会讨论这个问题。

Emphasis added. So it finds WinSCP.exe first and that's a kaboom, it is not a valid .NET assembly. The simple workaround is rename the DLL, that changes the display name of the assembly.

于 2013-02-19T19:13:15.127 回答