【问题标题】:C# cannot find library during runtimeC# 在运行时找不到库
【发布时间】:2009-03-10 09:43:42
【问题描述】:

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

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

我在哪里可以告诉项目在运行时到哪里寻找库?

谢谢

【问题讨论】:

    标签: c# reference runtime local


    【解决方案1】:

    看看this MSDN 文章。这是关于 元素的。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        观察两者之间的区别:

        1. 编译时程序集解析
        2. 运行时程序集解析

        GAC 程序集总是在运行时解析。 GAC 程序集默认是共享程序集(考虑重用)。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 全局程序集缓存,位于 c:\\assembly.
          • 在 Google 上搜索如何将程序集安装到 GAC。这不是简单的复制操作。但如果您不了解 GAC,我假设您想将 CopyLocal 设置为 true。
          【解决方案5】:

          要引用此 dll,需要将其复制到本地或 GAC(全局程序集缓存)中。拥有本地副本是首选方式,因此我建议将本地副本切换为 true。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              为什么将所有外部程序集与您制作的程序集一起复制是不正确的?

              您可以使用 XCOPY 部署,以便所有程序集驻留在 1 个位置。

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

              【讨论】:

                【解决方案8】:

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

                1) 说明要求并假设 dll 将安装在 GAC 中。它在大多数情况下都不起作用,并且在本地拥有程序集是有目的的:如果某些系统范围的更新与您的依赖项混淆,您的应用程序不应该中断。

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-06-12
                  • 2017-10-25
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-06-21
                  • 2016-12-28
                  • 2018-10-20
                  相关资源
                  最近更新 更多