2017-07-21 16 views
0

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

我见过this related post但我完全失去了这个GAC和所有这些C#的细节。

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

+0

如果你不想注册组件与GAC或惹的文件路径,然后请你帮个忙,并让他们在同一文件夹作为您的可执行文件。 – hoodaticus

+0

我宁愿乱用文件路径;)我想了解它是如何工作的 – fazega

+0

然后,Derek给了你你应该接受的答案。您可以重写程序集解析过程,并使用C#代码自己在运行时查找并加载DLL。 – hoodaticus

回答

1

通常情况下,一个bin文件夹的目的是为您的部署包的主要成分。在非常简单的应用程序部署中,程序需要的所有内容都存在于bin文件夹中。你可以复制粘贴该文件夹在任何地方,它会工作。当然,如果你的外部装配不在那里,那不会发生。

你发现那些程序集不应该存在于你的开发机器上的两个地方,我明白你为什么不喜欢那个。 CopyLocal默认设置为true的原因是因为我上面描述的典型场景值得在开发机器中存在两次程序集的成本。通常情况下,应用程序将比开发机器多出许多倍的客户端机器,因此单个部署文件夹的简单性值得开发机器上磁盘空间的成本。

你说你自己,你会包括:每当你想给你的exe文件给别人lib文件夹?仅仅给bin文件夹添加所有内容不是更简单吗?

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

您可以通过编写自己的程序集分辨率来规避所有这些情况,但除非您要挨饿几千字节的磁盘空间,否则让Visual Studio可以做到这一点。

+0

完美的答案。 – fazega

3

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

+0

不明白你的观点。如果我需要给某人这个程序(实际上是这种情况),我会给他/ libs和.exe,如果我告诉他它在./libs中,.exe应该找到程序集。我不明白将它放入/ bin并将其放入/ libs中的区别。 – fazega

+2

@FaZeGa“.exe应该找到程序集”你必须编写代码。你已经告诉编译器组件在哪里,但不是.exe。默认情况下,exe文件将在GAC中查看,在当前文件夹中,执行一些[探测](https://docs.microsoft.com/en-us/dotnet/framework/deployment/how-the-runtime-locates-assemblies)和然后爆炸。 –