CopyLocal = false filenotfound

时间:2017-07-21 17:49:08

标签: c#

我有一个使用外部程序集的项目,位于/ libs文件夹中。 当我构建项目时,我不想将所有这些程序集复制到bin文件夹中,因为它们已经在/ libs中了!所以我设置CopyLocal = false,但编译器无法找到这些程序集。

我已经看过this related post,但我完全迷失了这个GAC和所有这些C#细节。

有人可以解释为什么它如此复杂而且不仅仅是编译器:如果在路径P上引用程序集,我将其加载到路径P上,如果copylocal = false,我不会将它添加到我的构建中?

2 个答案:

答案 0 :(得分:3)

如果您想与其他人分享此计划,该怎么办?你必须给他们bin文件夹和lib文件夹,也许他们必须在Windows资源管理器中处于不同的级别(以便能够找到它们)。当程序用完bin文件夹时,它需要知道在哪里找到它需要运行的文件。最简单的方法之一是打开本地副本,以便将其复制到bin文件夹。你也可以查看“AssemblyResolve”,但它有点复杂,我认为你不想进入那个。

答案 1 :(得分:1)

通常,bin文件夹旨在作为部署包的主要组件。在非常简单的应用程序部署中,bin文件夹中存在程序所需的所有内容。您可以将该文件夹粘贴到任何地方,这样就可以了。当然,如果您的外部装配不存在,那将不会发生。

您发现这些程序集不应该存在于开发计算机上的两个位置,我理解您为什么不喜欢它。 CopyLocal默认设置为true的原因是因为我上面描述的典型场景值得在开发机器中两次存在程序集的成本。通常,应用程序将存在于比开发机器多很多的客户端机器上,因此单个部署文件夹的简单性值得开发机器上的磁盘空间成本。

你曾经说过,只要你把你的exe给别人,你就会包含lib文件夹吗?将bin文件夹中的所有内容都放在其中会不会更简单?

在你原来的问题中,你提到编译器找不到程序集,我认为这是不正确的,我测试了类似的情况。编译器找到了程序集,但是当我尝试执行代码时,运行时告诉我它无法找到它。编译器不插入代码以使可执行文件在相对路径中查找程序集。您可以找到.Net外部程序集here的详细探测行为。你的exe不能神奇地猜测程序集在父文件夹的lib文件夹中。

您可以通过编写自己的程序集解析来规避所有这些,但除非您想要几千字节的磁盘空间,否则让Visual Studio自行完成。