将C#项目引用放在子文件夹中

时间:2011-02-09 11:22:41

标签: c# visual-studio-2008 dll dependencies

我有一个包含多个项目的解决方案,所有项目都输出dll(当然主要应用程序除外)。对于所有引用,将local local设置为true,并且与exe在同一目录中的dll一切都很好并且花花公子。

我的问题是这很难看。我想将所有dll放在子文件夹中(实际上是两个子文件夹)。我如何在Visual Studio 2008中执行此操作?

我发现了一些看似相似的问题,但我找不到我知道的简单答案。

编辑:为了更清楚,我想知道如何使程序集加载器在操作目录之外的某处查找引用。用户将与目录中的一些其他文件进行交互,并且对他们的影响就越小。

编辑2:我也想避免使用GAC。应用程序需要自包含。

5 个答案:

答案 0 :(得分:4)

您是否尝试过AppDomain命名空间?

AppDomain.CurrentDomain.AppendPrivatePath

http://www.vcskicks.com/csharp_assembly.php

答案 1 :(得分:2)

AssemblyResolve

public static class AssemblyResolver { 
    static AssemblyResolver() { 
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(delegate(object sender,  ResolveEventArgs args) {
            return Assembly.LoadFrom(...); 
        }); 
    }  
} 

答案 2 :(得分:1)

使用app.config <probing>元素指示.NET运行时查找子文件夹以查找其他程序集。请参阅here

答案 3 :(得分:0)

您不能将这些引用放在子文件夹中。因为它们不会被应用程序的运行时“看到”。

放置它们的第一个位置是调试目录,然后是全局程序集缓存(又称GAC)。请注意,您在Add Reference对话框中的(.Net)选项卡中看到的实际上是GAC目录中的引用。

注意:如果您使用TFS作为后端源代码控制,请注意,在执行签入时,引用不会复制到源代码控制存储库,而是必须手动复制它们。

答案 4 :(得分:0)

我只是发表了一篇文章,详细说明了所有这些内容。 Partitioning Your Code Base Through .NET Assemblies and Visual Studio Project

以下是本文的最终指导原则:

  • 大幅减少代码库的程序集数量。
  • 仅当物理分离的特定要求证明了这一点时,才创建新的程序集。
  • 在Visual Studio项目中,使用“按程序集引用”而不是“Visual Studio项目引用”。
  • 切勿使用Visual Studio引用选项“Copy Local = True”。
  • 将所有VS解决方案和Build动作.bat文件放在$ rootDir $目录中。
  • 编译目录中的所有程序集:$ rootDir $ \ bin \ Debug和$ rootDir $ \ bin \ Release
  • 使用目录$ rootDir $ \ bin来托管测试程序集。