【问题标题】:Reference DLLs in ASP.NET without \Bin or GAC在没有 \Bin 或 GAC 的 ASP.NET 中引用 DLL
【发布时间】:2010-01-13 18:15:59
【问题描述】:

我有一个受源代码控制 (Subversion) 的 ASP.NET 项目。由于各种原因,我不想将 \Bin 目录或其内容添加到源代码管理中,所以我将其设置为 svn:ignored。在 Visual Studio 构建期间将 DLL 加载到此处,我可以从一个干净的目录开始和/或删除该目录的所有内容,并且仍然可以成功构建。

我有两种方法可以引用包含在项目中的代码:

  1. 在 Web.config 元素中 //configuration/configSections/system.web/compilation/assemblies。我可以通过这种方式<add> GAC 中的任何 DLL。我对所有系统 dll 执行此操作。
  2. 在 VS 解决方案中,Project/ProjectSection/ProjectReferences 有一个设置,可让我指定对解决方案中其他项目的引用。

(请注意,这与非 Web 项目不同,其中 所有 对外部依赖项的引用都存储在项目文件中。VS Web 项目没有项目文件,因此它们必须存储在某个地方否则。)

现在我有一个第三方编译的 DLL,我想将它包含在项目中。不幸的是,我发现的所有引用选项似乎都不适合我:

  1. 除非 GAC 中存在 DLL,否则无法通过 web.config/system.web/compilation/assemblies 进行引用;你不能使用文件路径。我真的很想避免 GAC 依赖,因为这意味着需要额外的步骤才能使项目在每台目标机器上运行。
  2. 我还没有找到一种方法来在解决方案中包含文件引用,就像我对项目引用所做的那样。
  3. 每当我使用 VS 的“添加引用”对话框添加文件引用时,它只是将 DLL 复制到 \Bin 目录。这对我不起作用,因为我的 \Bin 目录不是跨系统持久的。

还有其他方法可以引用 DLL 文件并将其粘贴吗?

【问题讨论】:

    标签: asp.net dll reference web-config


    【解决方案1】:

    如果您正在进行任何严肃的开发,我建议您从网站项目迁移到 Web 项目,因为这样您可以在整个解决方案中以相同的方式管理这些依赖项。

    但是,假设您不能这样做,请将您需要从 Web 项目引用的所有程序集放入某个文件夹中(例如 lib\web ),并在您的 Web 项目中添加一个预构建事件来复制内容将该文件夹复制到 web 目录的 bin 文件夹中。现在,无论何时你想为你的 web 项目添加一个依赖项,你都可以将它放在 lib\web 文件夹中,然后添加引用。每当您构建时,所有引用的程序集都将被复制到该文件夹​​中,因此您可以删除 bin 文件夹或进行干净的检出,而不会出现任何问题。

    【讨论】:

    • 您提供的解决方案不起作用:我们无法向网站添加预构建事件。
    【解决方案2】:

    从技术上讲,在第 3 步中会发生更多事情。 Visual Studio 将 DLL 复制到您的 \Bin 目录并添加一个 name.dll.refresh 文件,其中包含原始 DLL 的路径。使用 SourceSafe,.refresh 文件受版本控制,因此当您设置新系统并从 SourceSafe 获取最新代码时,Visual Studio 可以从指定位置找到并复制 DLL。您应该能够将 .refresh 文件放入 svn 并让一切正常。

    另外,我通常在我的项目目录上方创建一个 \Common 目录,这是我放置 DLL 的位置,并且我将该目录包含在解决方案(和源代码管理)中,以便我的项目在源代码管理中的每个版本都有正确的 DLL。

    【讨论】:

    • 我想知道这一点。但是,要让 .refresh 进入 SVN,我必须有 \bin,如果我有 \bin,我还不如将 DLL 复制到那里。
    • 如果我错了,请纠正我,但即使在解决方案中使用 \Common,您仍然必须手动将 DLL 和/或 .refresh 复制到 \Bin 中,对吗?
    • 当您通过“添加引用”添加 DLL 时,会自动创建 .refresh。只要你把它放在源代码控制中,并且把 DLL 放在所有机器上的同一个地方,一切都会正常工作。其他机器从源代码管理下载 .refresh 并在构建期间从指定位置复制 DLL。将 .refresh 放入源代码控制而不是 DLL 的优点是在构建期间不会触及 .refresh 文件。 DLL 是,导致每次构建时都进行不必要的检出。
    【解决方案3】:

    到目前为止,我想到的唯一方法是让我的 NAnt 构建脚本在构建之前将 DLL 从外部(版本化)lib 目录复制到 \Bin 目录中。我不太喜欢这个,因为它引入了 Visual Studio 之外的进程依赖:开发人员必须确保在尝试在 VS 内部构建之前复制库。

    【讨论】:

      【解决方案4】:

      我在源代码管理中保存没有源代码的第 3 方程序集。在他们自己的项目之外的目录中 - `C:\Projects\3rdPartyAssemblies' 这样任何需要它们的项目/开发人员都可以引用它们。

      【讨论】:

      • 但是如何获得对 DLL 的引用以坚持到项目中呢?这就是我问题的症结所在。
      • 对不起,我不确定我是否理解你。您可以通过选择浏览选项卡以与项目引用相同的方式包含文件引用。它确实将其复制到 bin 目录,但仍保留引用。
      • 实际上,在我的测试中,它在 \bin 目录中的文件存在之外维护引用。如果您关闭解决方案并删除 DLL/.refresh,那么当您重新打开解决方案时,该引用将从对话框中消失。与项目或 GAC 引用不同,文件引用通过文件在 \Bin 中的存在来维护——除非有另一种方法可以做到这一点,这就是我要问的。
      • 我明白了。这是一个 ASP.NET Web 应用程序项目,还是只是一个普通的 ASP.NET 网站?因为我创建了一个新的 Web 应用项目,添加了对外部 dll 的引用,在代码中使用了 dll,构建,删除了 bin 目录,再次运行,一切正常。
      【解决方案5】:

      项目引用存储在应受源代码控制的 .csproj 或 .vbproj 文件中。 .refresh 文件完全无关紧要,只是工作室的辅助文件。如果您创建项目或解决方案的本地目录并将 GAC 中尚未编译的所有引用存储在此目录中,则可以将该目录添加到源代码管理并直接从那里引用。这样可以保证所有开发人员在执行下一次编译时都拥有 .dll 的最新副本(来自源代码管理),并且永远不会影响 /bin。

      让您的开发人员“获取最新版本”……您只能靠自己。还是没搞清楚。

      也许是另一个备忘录。

      【讨论】:

      • 网站没有 .csproj 或 .vbproj,因此使用 .refresh 文件。
      • 您说得对,先生。我说错了。网站项目的引用实际上保存在 .sln 文件中的 ProjectReferences 键下(网站应该需要但可能不需要)。哎呀。
      猜你喜欢
      • 2010-11-07
      • 2013-10-25
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多