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