Visual Studio添加与dll同名的可执行文件

时间:2013-02-19 02:07:08

标签: c# visual-studio dll assemblies

在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的复杂性?

1 个答案:

答案 0 :(得分:7)

  

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

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

  

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

重点补充。所以它首先找到WinSCP.exe,这是一个kaboom,它不是一个有效的.NET程序集。简单的解决方法是重命名 DLL,它会更改程序集的显示名称。