没有\ Bin或GAC的ASP.NET中的引用DLL

时间:2010-01-13 18:15:59

标签: asp.net dll reference web-config

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

我可以通过两种方式引用代码以包含在项目中:

  1. 在Web.config元素中//configuration/configSections/system.web/compilation/assemblies。我可以<add>以这种方式在GAC中的任何DLL。我为所有的系统dll做了这个。
  2. 在VS解决方案中,Project/ProjectSection/ProjectReferences处有一个设置,可让我指定对解决方案中其他项目的引用。
  3. (请注意,这与非Web项目不同,其中所有对外部依赖项的引用都存储在项目文件中。对于VS Web项目没有项目文件,所以它们必须存储在某个地方别的。)

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

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

5 个答案:

答案 0 :(得分:5)

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

但是,假设您无法执行此操作,请将需要从Web项目引用的所有程序集放在某个位置的文件夹中(例如lib \ web),并将预构建事件添加到复制内容的Web项目中将该文件夹放入web目录的bin文件夹中。现在,只要您想为Web项目添加依赖项,就可以将其放在lib \ web文件夹中,然后添加引用。无论何时构建,所有引用的程序集都将被复制到文件夹中,这样您就可以删除bin文件夹或执行干净的检出并且没有任何问题。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

让您的开发人员“获取最新版本”...您可以自己选择该版本。我还没弄明白。

也许是另一份备忘录。