2011-02-09 62 views
7

我有一个解决方案,其中包含所有输出dll的多个项目(当然除主应用程序外)。对于所有的引用,复制本地被设置为true,并且一切都很好,并且在与exe相同的目录中有dll。在子文件夹中放置C#项目引用

我的问题是,这是丑陋的。我想把所有的dll放在一个子文件夹中(实际上有两个子文件夹是精确的)。我如何在Visual Studio 2008中执行此操作?

我发现了几个似乎相似的问题,但我找不到我知道必须存在的简单答案。

编辑:为了更清楚,我想知道如何使程序集加载器除了操作目录外的其他地方查找引用。用户将与目录中的一些其他文件进行交互,并且对他们来说越不好看。

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

+0

但是,他们将如何加载?你将不得不手动加载每个DLL,这只是糟透了。如果你这样做了,你就不会参考这些项目 - 你不能简单地使用它们中的类型。总的矫枉过正和大脑爆炸。 – 2011-02-09 11:26:48

+0

理想情况下,VS中有一些方法可以使应用程序查找除操作目录之外的所有依赖项。我无法想象这是如此困难。 – daedalus28 2011-02-09 11:31:54

回答

2

或者AssemblyResolve

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

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

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

注:如果使用TFS作为后端源控制,需要注意的参考,当你进行检查,在没有复制到源代码控制库,而你必须手动复制它们。

0

我刚刚发布解释所有这些细节与文章。 Partitioning Your Code Base Through .NET Assemblies and Visual Studio Project

下面是导致文章的准则:

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

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

相关问题