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

Pau*_*per 7 c# dll assemblies visual-studio

在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错综复杂?

Han*_*ant 7

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

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

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

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

  • 我明确地记录了这一点,"首先尝试使用该名称的EXE文件,然后再尝试DLL文件". (2认同)