【发布时间】:2014-10-15 06:11:40
【问题描述】:
我有一个完全充满了在另一个程序集中实现接口的类的程序集。例如:
Main Assembly (Reference to both assemblies)
Shared Assembly
-----IModule
Class Assembly (Reference to shared assembly)
-----unknownType : IModule
-----unknownType2 : IModule
Main 程序集没有直接引用 Class 程序集中的任何类型。我正在寻找这样的类型:
// Load all referenced assemblies:
Assembly.GetExecutingAssembly().GetReferencedAssemblies()
.Except(AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetName()))
.Distinct()
.ToList()
.ForEach(act => Assembly.Load(act));
// Find all instances of IModule in loaded assemblies:
var modules = from asm in AppDomain.CurrentDomain.GetAssemblies()
from provider in asm.GetTypes()
where typeof(IModule).IsAssignableFrom(provider)
...instantiate type etc...
如果我在类程序集中只引用了任意类型,那么它会显示在 GetReferencedAssemblies 中,被加载并正确返回 - 但一旦我删除对该类型的引用,它就不会转移到构建目录或显示为导致加载失败的引用程序集。
有没有办法强制 VS 在输出目录中包含这个程序集?主应用程序不应该知道类程序集中的任何类型。
【问题讨论】:
-
我记得有一个类似的问题,我找到的唯一解决方案是向项目中引用的程序集添加一个虚拟调用...
-
@KevinD:由于主程序集不应该知道类程序集中发生了什么,因此我实际上无法添加虚拟引用,除非我预先知道类程序集中的类型是专门为那个目的。问题是这里的例子过于简化,这样做会给设计增加不必要的复杂性和泥泞。
-
这是一个特定于解决方案的问题,还是您可以提供在任意上下文中重现它的步骤?
-
您可以在“实施”程序集上添加构建后操作,以将其手动复制到主程序集的 bin 文件夹中。出于类似的原因,我必须做一次类似的事情才能让MEF 正常工作。
-
我想你是想在运行时注入实现而不是在编译时引用它们?我们通过在给定目录中加载所有二进制文件并针对其所需接口注册实现来实现这一点。然后您的主程序集可以使用构建后步骤将所需的实现复制到 bin 目录中。
标签: c# .net reflection visual-studio-2013 .net-assembly