C#在运行时找不到库

C#在运行时找不到库,c#,reference,runtime,local,C#,Reference,Runtime,Local,我有一个使用dll的C#项目。我将dll添加到项目引用中,并将属性Copy Local设置为False(我不希望有该dll的本地副本) 编译看起来不错,但当我尝试运行C#应用程序时,它找不到dll 在运行时,我在哪里可以告诉项目在哪里查找库 谢谢如果将CopyToLocal设置为false,则需要在中安装该程序集 如果将CopyToLocal设置为false,则需要在中安装该程序集 使用来跟踪解决程序集的问题 如果不想拥有DLL的本地副本,则必须将其放入全局程序集缓存(GAC)中,或将指令添加到

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

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

在运行时,我在哪里可以告诉项目在哪里查找库


谢谢

如果将CopyToLocal设置为false,则需要在中安装该程序集

如果将CopyToLocal设置为false,则需要在中安装该程序集

使用来跟踪解决程序集的问题

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

使用来跟踪解决程序集的问题


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

要引用此DLL,需要将其复制到本地或GAC(全局程序集缓存)中。拥有本地副本是执行此操作的首选方法,因此我建议将copy local切换为true。

要引用此dll,需要在本地或GAC(全局程序集缓存)中复制它。拥有本地副本是实现这一点的首选方法,因此我建议将“本地副本”切换为true。

看看MSDN文章。它是关于元素的

指定应用程序库 公共语言的子目录 加载时要搜索的运行时 装配

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

看看MSDN文章。它是关于元素的

指定应用程序库 公共语言的子目录 加载时要搜索的运行时 装配

这允许您告诉应用程序在哪里可以查找默认/bin文件夹以外的程序集

请注意,它查找“子目录”,因此它不能是完全不同的文件夹。它必须位于应用程序基础文件夹中

应用程序将在与可执行文件相同的路径和路径env中查找.dll。
但正如BtBh所说:只有在将此程序集放入GAC时才使用off开关。

应用程序将在与可执行文件相同的路径和路径env中查找.dll。
但正如BtBh所说:只有在将此程序集放入GAC时才使用off开关。

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

注意以下两者之间的区别:

  • 编译时程序集解析
  • 运行时程序集解析
  • GAC程序集始终是运行时解析的。默认情况下,GAC程序集是共享程序集(考虑到重用)


    编译时解析用于完成构建。尽可能多地使用项目引用(在解决方案中使用程序集)。如果您不负责要使用的程序集的生成,并且这些程序集不在您的解决方案中,请使用文件引用。

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

    注意以下两者之间的区别:

  • 编译时程序集解析
  • 运行时程序集解析
  • GAC程序集始终是运行时解析的。默认情况下,GAC程序集是共享程序集(考虑到重用)


    编译时解析用于完成构建。尽可能多地使用项目引用(在解决方案中使用程序集)。如果您不负责要使用的程序集的生成,并且这些程序集不在您的解决方案中,请使用文件引用。

    为什么要将所有外部程序集与您创建的程序集一起复制

    您可以使用XCOPY部署,以便所有程序集都位于一个位置


    部署组件的另一种方法是将它们全部打包在一个安装程序包(MSI)中。

    为什么要将所有外部程序集与您制作的程序集一起复制

    您可以使用XCOPY部署,以便所有程序集都位于一个位置


    部署组件的另一种方法是将它们全部打包在一个安装程序包(MSI)中。

    如果您不想使用自己的dll分发第三方dll,您可以:

    1) 说明要求,并假设dll将安装在GAC中。它在大多数情况下都不起作用,在本地安装程序集有一个目的:如果某个系统范围的更新破坏了您的依赖关系,那么您的应用程序就不会崩溃

    2) 咬紧牙关,用自己的dll分发第三方dll


    3) 如果这样做是合法的(注意第三方dll的许可条款),请使用静态链接程序集(您自己和任何第三方)。使用ILMerge,您可以得到一个包含所有引用的程序集。只有在打包进行部署时(有自定义的msbuild/NAnt任务可以为您进行合并),在VS中开发时,您才可以继续执行以前的操作(引用程序集)。ILMerge在许多项目中使用,以获得一个自包含、紧凑的可执行文件(我想到的是LinqPad)。

    如果您不想用自己的dll分发第三方dll,您可以:

    1) 说明要求,并假设dll将安装在GAC中。它在大多数情况下都不起作用,在本地安装程序集有一个目的:如果某个系统范围的更新破坏了您的依赖关系,那么您的应用程序就不会崩溃

    2) 咬紧牙关,用自己的dll分发第三方dll

    3) 如果这样做是合法的(注意