【问题标题】:How to save DLLs in a different folder when compiling in Visual Studio?在 Visual Studio 中编译时如何将 DLL 保存在不同的文件夹中?
【发布时间】:2011-07-03 21:23:48
【问题描述】:

假设我有一个 Window Forms / Console Application C# 项目,其中包含一些 外部引用 和对其他类库项目也在同一解决方案中。

当我构建 Window Form 项目时,我希望将引用的库存储在不同的位置(例如:bin\Release\Libraries),与 .exe 不在同一文件夹中

可以吗?

【问题讨论】:

  • 您将它们作为文件参考还是项目参考?
  • 有一个后期构建步骤,但您还必须更改 AppDomainSetup 以设置程序集的探测路径,否则您的库 dll 将永远不会加载。你想过吗?
  • @mellamokb 两者。我的解决方案中有对项目的引用,而那些(以及 WinForm 也是)也有对外部 .dll 文件的引用。
  • 这里的主要问题是您为什么要这样做?在 Libraries 子文件夹下放置 DLL 有什么好处?
  • @Petar 这就是我在部署应用程序的可交付成果时通常会做的事情,我认为只有一个 .exedocslicense 文件 等比将.exe 文件和5-10 个.dll 文件放在同一个文件夹中要干净得多(在这种情况下:部署= 只是压缩文件)

标签: c# visual-studio assemblies projects-and-solutions


【解决方案1】:

在项目人员中设置参考路径。

您还可以通过在项目人员中指定输出路径来指定编译的 exe 的去向。

【讨论】:

    【解决方案2】:

    是的,这是可能的,您可以在 msbuild 脚本中执行此操作。虽然我不能给你一个确切的答案,但请在 SO Copy all files and folders using msbuild 上查看这个问题

    【讨论】:

      【解决方案3】:

      您的问题分为两部分:

      如何配置解决方案以将程序集/EXE 构建到您选择的文件夹中 - 这是通过 VS 中项目的属性配置的(项目属性 -> 构建 -> 输出路径)。在每个引用上检查“复制本地”属性的值也是如此。

      如何从非默认位置(即从您的 ...\Libraries 文件夹)加载程序集文件 - 您需要更改 app.config 文件以将此非默认路径添加到程序集搜索位置..

      链接到 Microsoft 站点不再有效,因此来自 Wayback 机器的摘要:How to load an assembly at runtime that is located in a folder that is not the bin folder of the application

      方法 1:在全局程序集缓存 (GAC) 中安装程序集。 GAC 是安装公共语言运行时的计算机范围的代码缓存。 GAC 存储您专门指定由多个应用程序共享的程序集。

      注意您只能在 GAC 中安装强名称程序集。

      方法 2:使用带有标签的应用程序配置 (.config) 文件 .config 文件包含以下设置:

      • 特定于应用程序的设置

      • 公共语言运行时读取的设置,例如程序集绑定策略设置和远程处理对象设置

      • 应用程序读取的设置

      <codeBase> 标记指定公共语言运行时可以在何处找到程序集。公共语言运行时应用来自 .config 文件的 <codeBase> 标记的设置。 <codeBase> 标签的设置决定了程序集的版本和位置。

      方法 3:使用 AssemblyResolve 事件 每当公共语言运行库尝试绑定到程序集但失败时,AssemblyResolve 事件就会触发。您可以使用 AddHandler 方法将事件处理程序添加到应用程序,以便在 AssemblyResolve 事件触发时返回正确的程序集。

      AssemblyResolve 事件处理程序必须返回一个 [Assembly] 对象,并且公共语言运行时必须绑定到该对象。通常,您可以使用 Assembly.LoadFrom 方法加载程序集,然后返回对象。

      【讨论】:

      • 在此答案的第二部分,还可以查看 <Probing> .config 元素 - 它允许您指定其他(子)目录来搜索程序集
      【解决方案4】:

      您可以在此处找到组织项目参考的最佳实践:http://codebetter.com/patricksmacchia/2009/01/11/lessons-learned-from-the-nunit-code-base/

      查看章节“VisualStudio 项目参考 + 复制本地 true 选项是邪恶的!”

      【讨论】:

      • 引用页面中的引用:“在使用 VisualStudio 编译 NUnit 解决方案时,程序集 nunit.core.dll 被复制了 21 次!这意味着它必须被复制/加载/解析 21 次C# 编译器显然没有针对这种情况进行缓存/哈希码优化。”而且“确实,NUnit 的代码分层非常好。这是最初决定创建大量程序集的结果。”因此,基本上以牺牲编译时间为代价,拥有大量程序集可以指导更好的代码。还不错。
      【解决方案5】:

      前面给出了正确的答案。我只想提一下,有一个名为 PrettyBin 的 nuget 包。

      将它安装在您的启动项目中。 DLL 和 XML 将转到 lib 文件夹,如果您不进行自定义,您将有一个工作示例来说明它是如何完成的。

      【讨论】:

      • 目前为止最简单的解决方案!谢谢!
      • 我有将构建目录的内容复制到 .zip 的构建后事件。这些构建后事件似乎在 PrettyBin 进行“清理”之前运行。你知道如何让 PrettyBin 在构建后事件之前运行吗?
      • @jenovachild 这可能不再相关,但如果有人仍然想知道:PrettyBin 仅在 .csproj 文件中添加了一个额外的 After Build 步骤。如果您需要在某些特定文件之前/之后运行它,只需卸载您的项目,打开 .csproj 文件并修改 AfterBuild 事件的顺序。
      猜你喜欢
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多