【问题标题】:How can I force C# build process to include assemblies not used in the code如何强制 C# 构建过程包含代码中未使用的程序集
【发布时间】:2015-07-22 09:44:41
【问题描述】:

我有一个名为 Company.Application 的应用程序。它确实使用了库:

  • Company.InversionOfControl
  • Company.Functionality.Contracts
  • Company.Functionality

应用程序使用 InversionOfControl 来侦察程序集部分应用程序域,使用:

appDomain.GetAssemblies()

问题在于 Company.Application 从不直接引用 Company.Functionality 中的代码,而是依赖于 Company.Functionality.Contracts 中定义的接口> 和 Company.InversionOfControl 耦合定义的功能 Company.Functionality 并将其注入 Company.Application

因此,有时应用程序的域看不到程序集 Company.Functionality(即 appDomain.GetAssemblies())。

我的问题是 - 有没有办法强制包括 Company.Functionality

【问题讨论】:

  • “添加到最终捆绑包”是什么意思?
  • 使用构建后复制命令。看到这个问题stackoverflow.com/questions/4606670/…
  • 这是一个 ClickOnce 应用吗?
  • @Kevin 或者只是将构建目录设置为Company.Application的bin文件夹
  • 编辑了原帖。通过“添加到最终包”,我的意思是 appDomain.GetAssemblies() 没有列出 Company.Functionality 程序集,即使项目中引用了

标签: c# dependency-injection msbuild inversion-of-control


【解决方案1】:

我找到的唯一解决方案是做虚拟行,例如:

var t = new[] {typeof(Company.Functionality.FirstClass)}

在 Company.Application 的初始化中。

这将强制编译器包含程序集。但是,这需要管理这些线路。

【讨论】:

  • 如果客户端程序集必须直接引用实现程序集,这违背了 IoC 的目的。
  • @MickyDuncan 我不会说它打败了 IoC 的对象,但它是一个不需要的讨厌的 hack。
  • 确实很糟糕,这是发布此帖子的重点。然而不幸的是,这似乎是匿名使用程序集的唯一原因将是 AppDomain 的一部分。
【解决方案2】:

通常根应该知道建立上下文的一切。如果这是动态完成的,则应将 IoC 库参数化以通过代码将程序集加载到应用程序域。如果不是这种情况,您必须通过 AppDomain.LoadFrom 手动加载它。 我看到的大多数容器都需要一个抽象和实现都被引用和可见的地方来创建绑定。

【讨论】:

  • 显式引用的问题是“引用管理”的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
相关资源
最近更新 更多