Вопрос:

Assembly.GetTypes () не возвращает типы, которые реализуют интерфейс, определенный в другом месте.

c# reflection t4

349 просмотра

1 ответ

8274 Репутация автора

Я работаю над созданием списка всех реализаций определенного интерфейса в моем приложении, и я пытаюсь сделать это путем отражения в шаблоне 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интерфейса во второй сборке?

Автор: glenatron Источник Размещён: 06.04.2017 11:18

Ответы (1)


0 плюса

8274 Репутация автора

Следуя комментариям Ханса Пассанта, я смог решить эту проблему, убедившись, что использовал копии библиотек, принадлежащих одной цепочке зависимостей, а не копии из разных источников (выбирая, какие папки вывода я выбрал с этого момента) в этот момент все реализации интерфейса появились в моих коллекциях.

Надеемся, что это может помочь любому, кто столкнется с той же проблемой, но было бы здорово получить ответ, который более подробно описывает точный процесс, который приводит к проблеме.

Автор: glenatron Размещён: 06.04.2017 02:57
Вопросы из категории :
32x32