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

Posted

技术标签:

【中文标题】Visual Studio 添加与 dll 同名的可执行文件【英文标题】:Visual Studio adding executable file with same name as dll 【发布时间】:2013-02-03 14:41:27 【问题描述】:

在 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?

【问题讨论】:

推测 WinScp.dll 是一个 .NET 程序集,但 WinScp.exe 不是? WinSCP .NET Assembly WinSCP.dll 基本上只是一个包装器,它负责使用带有命令行参数的 WinSCP.exe 来创建进程。默认情况下,.dll 在同一目录中查找可执行文件,但可以在调用代码中更改(我当前的解决方法是将 WinSCP.exe 更改为 WinSCP_.exe 并进行适当的更改,但必须有更好的方法)。 也许您可以将WinSCP.exe 文件存储在其他位置并使用构建后步骤将其复制到输出目录? WinSCP 开发人员建议重命名 DLL 而不是可执行文件:“您可能希望将 winscp.exe 添加到您的 Visual Studio 项目中,以使其自动复制到输出路径(通过设置文件属性生成器操作为 None 并复制到输出目录以复制(如果较新)。请注意,这会使 winscp.dll 和 winscp.exe 发生冲突。您需要重命名 winscp.dll 以赋予其不同的基本名称,例如 winscpnet.dll"。我想这消除了修改 WinSCP.dll 代码的需要?来自winscp.net/eng/docs/library_install 【参考方案1】:

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

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

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

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

【讨论】:

Re: "它不注意文件扩展名" 我将.exe 重命名为无意义的.com,它没有这个问题。它显然必须对扩展至少一点点(但显然只有一点点)。 我明确记录了“首先尝试使用该名称的 EXE 文件,然后是 DLL 文件”。

以上是关于Visual Studio 添加与 dll 同名的可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

visual studio怎么添加对dll的引用

visual studio2017 添加dll库

如何在 Visual Studio 中将 Dll 添加到 MFC 应用程序

在 Visual Studio 2013 中添加对您自己的 DLL 项目的依赖项/引用

Visual Studio 2017 动态链接库(DLL /LIB) 静态链接库(LIB)的思考

无法从 Visual Studio 2008 添加对 WixUIExtension.dll、WixUtilExtension.dll 和 WixNetFxExtension.dll 的引用