C#在运行时无法找到库

时间:2009-03-10 09:43:43

标签: c# reference runtime local

我有一个使用dll的C#项目。我将dll添加到项目引用中,并将属性Copy Local设置为False(我不想拥有该dll的本地副本)。

编译看起来很好,但是当我尝试运行C#应用程序时,它找不到dll。

在哪里可以告诉项目在运行时期间在哪里查找库?

由于

8 个答案:

答案 0 :(得分:3)

查看this MSDN文章。这是关于< probing> 元素。

  

指定应用程序库   共同语言的子目录   加载时搜索运行时   组件。

这允许您告诉应用程序它可以在哪里查找默认/ bin文件夹以外的程序集。
请注意,它会查找“子目录”,因此它不能是完全不同的文件夹。它必须驻留在您的应用程序基础文件夹中。

答案 1 :(得分:1)

使用Fusion Log Viewer跟踪解决程序集的问题。

如果您不想拥有DLL的本地副本,则必须将其放入全局程序集缓存(GAC)或将Assembly Redirection指令添加到app.config或machine.config。

答案 2 :(得分:1)

为什么要将项目引用的copylocal设置为false?不建议这样做。

注意:

之间的区别
  1. 编译时间程序集解析
  2. 运行时程序集解析
  3. 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浮现在脑海中)。