我有一个使用 dll 的 C# 项目。我将 dll 添加到项目引用中,并将属性 Copy Local 设置为 False(我不想拥有该 dll 的本地副本)。
编译看起来不错,但是当我尝试运行 C# 应用程序时,它找不到 dll。
我在哪里可以告诉项目在运行时在哪里寻找库?
谢谢
看看这篇MSDN 文章。这是关于<probing>元素的。
指定公共语言运行时在加载程序集时要搜索的应用程序基子目录。
这允许您告诉应用程序它可以在哪里查找默认 /bin 文件夹以外的程序集。
请注意,它会查找“子目录”,因此它不能是完全不同的文件夹。它必须驻留在您的应用程序基础文件夹中。
使用Fusion Log Viewer跟踪解决程序集的问题。
如果您不想拥有 DLL 的本地副本,则必须将其放在全局程序集缓存 (GAC) 中,或者将程序集重定向指令添加到您的 app.config 或 machine.config。
为什么要将项目引用的 copylocal 设置为 false?不建议这样做。
观察两者之间的区别:
GAC 程序集始终是运行时解析的。GAC 程序集默认是共享程序集(考虑重用)。
编译时解析用于完成构建。尽可能使用项目引用(在您的解决方案中使用程序集)。当您不负责构建要使用的程序集并且这些程序集不在您的解决方案中时,请使用文件引用。
如果您不想自己分发第三方 dll,您可以:
1) 说明要求并假设 dll 将安装在 GAC 中。它在大多数情况下都不起作用,并且在本地拥有程序集是有目的的:如果某些系统范围的更新与您的依赖项混淆,您的应用程序不应该中断。
2)咬紧牙关,用你自己的分发第三方dll。
3) 如果这样做是合法的(注意第三方 dll 的许可条款),请使用IL Merge静态链接您的程序集(您自己的和任何第三方)。使用 ILMerge,您最终可以拥有一个包含所有引用的程序集。您仅在打包部署时合并(有自定义的 msbuild/NAnt 任务为您执行此操作),在 VS 中进行开发时,您只需像以前一样继续做(引用程序集)。ILMerge 在很多项目中被用于拥有一个独立的、紧凑的可执行文件(想到 LinqPad)。
如果将 CopyToLocal 设置为 false,则将该程序集安装在GAC中。
要引用此 dll,需要将其复制到本地或 GAC(全局程序集缓存)中。拥有本地副本是首选方式,因此我建议将本地副本切换为 true。
应用程序将在与可执行文件相同的路径和 path-env 中查找 .dll。但正如 BtBh 所说:如果你把这个程序集放在 GAC 中,只使用关闭开关。
为什么将所有外部程序集与您制作的程序集一起复制是错误的?
您可以使用 XCOPY 部署,以便所有程序集驻留在 1 个位置。
部署组件的另一种方法是将它们全部打包在 1 个安装包 (MSI) 中。