我正在创建一个包含我的应用程序中特定接口的所有实现的列表,并且我试图通过在T4模板中反映来实现这一点,使用它来生成C#。
我有一些看起来像这样的代码:
<#@ assembly name="$(SolutionDir)\..\Project2\bin\project1.dll" #>
<#@ assembly name="$(SolutionDir)\..\Project2\bin\project2.dll" #>
<#@ import namespace="Project1.Interfaces" #>
<#
string assemblyPath1 = this.Host.ResolvePath("..\\Project2\\bin\\project1.dll");
string assemblyPath2 = this.Host.ResolvePath("..\\Project2\\bin\\project2.dll");
var type = typeof(Project1.Interfaces.IAction);
var types1 = Assembly.LoadFrom(assemblyPath1).GetTypes()
.Where(p => type.IsAssignableFrom(p) && p.IsClass).ToList();
var types2 = Assembly.LoadFrom(assemblyPath2).GetTypes()
.Where(p => type.IsAssignableFrom(p) && p.IsClass).ToList();
#>
显然真正的版本做了很多,你可以假设如果你不能看到import
指令,我在这里省略了它以简洁和可读性。但据我所知,这就是问题出现的地方。 types1
变量将包含大量IAction
实现的列表,但types2
列表将为空,尽管事实上我已经在我面前打开了Project2它肯定包含几个实现IAction
的公共类型。
从我可以看到的文档来看,这可能是因为IAction
接口是在Project1中定义的,并且在调用时加载的程序集可能存在与GetTypes()
相关的问题。但是,据我所知,实际调用运行顺利 - 我没有看到ReflectionTypeLoadException
被抛出 - 它只是找不到那些接口实现。如果我列出types2
集合中返回的所有内容的名称,则列表中不存在这些类名。
为了能够在第二个程序集中找到IAction
接口的实现,我需要做些什么?
答案 0 :(得分:0)
根据Hans Passant的评论,我能够通过确保使用属于同一依赖链的dll的副本来解决这个问题,而不是使用来自不同来源的dll(通过选择哪个输出)文件夹我从中获取了它们,此时界面的所有实现都显示在我的集合中。
希望这可以帮助遇到同样问题的任何人,但是能够得到更详细说明导致问题的确切过程的答案会很棒。