Assembly.GetTypes()不返回实现其他地方定义的接口的类型

时间:2017-04-06 11:18:46

标签: c# reflection t4

我正在创建一个包含我的应用程序中特定接口的所有实现的列表,并且我试图通过在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接口的实现,我需要做些什么?

1 个答案:

答案 0 :(得分:0)

根据Hans Passant的评论,我能够通过确保使用属于同一依赖链的dll的副本来解决这个问题,而不是使用来自不同来源的dll(通过选择哪个输出)文件夹我从中获取了它们,此时界面的所有实现都显示在我的集合中。

希望这可以帮助遇到同样问题的任何人,但是能够得到更详细说明导致问题的确切过程的答案会很棒。