2009-10-17 1 views
6

Мне нужен метод, который принимает тип и возвращает пути всех сборок, которые используются в типе. я писал:Получить пути сборок, используемых в типе

public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type) 
{ 
yield return type.Assembly.Location; 

foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies()) 
{ 
    yield return Assembly.Load(assemblyName).Location; 
} 
} 

Обычно этот метод сделать работу, но имеют некоторые недостатки:

  • я не нашел, как получить ссылки сборки/типы из самого типа, так Я использовал type.Assembly.GetReferencedAssemblies() и получил ссылки всей сборки, а не только те, которые относятся к типу.

  • type.Assembly.GetReferencedAssemblies() возвращает AssemblyName и не имеет свойства location/path/filepath. Чтобы получить свойство location, я сначала использовал Assembly.Load(), а затем использовал свойство location. Я не хочу, чтобы сборки загрузки получали свой путь, потому что они не нужны, и потому, что Assembly.Load() может завершиться неудачей с FileNotFoundException или BadImageFormatException.

ответ

9

Я думаю, что решил проблему Assembly.Load(), заменив его на Assembly.ReflectionOnlyLoad().

теперь это как мой метод выглядит следующим образом:

public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type) 
{   
    yield return type.Assembly.Location; 

    foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies()) 
    { 
     yield return Assembly.ReflectionOnlyLoad(assemblyName.FullName).Location; 
    } 
} 

теперь только левая проблема заключается в type.Assembly.GetReferencedAssemblies(), как я получаю ссылки сборок типа, а не от сборки?

+0

Все типы принадлежат сборкам - вы должны иметь возможность просто сделать тип. Assembly.GetReferencedAssemblies(). Ой, подождите, вы уже это делаете. Я предполагаю, что это так долго разрешено, не так ли? 2011? –

+0

@DxCK любое решение по этой проблеме? Моя проблема: проект моей библиотеки ссылается на Oracle.DataAccess 4.112.2.0, но во время выполнения загружает из GAC Oracle.DataAccess 4.121.1.0. Assembly.GetReferencedAssemblies() дает мне Oracle.DataAccess 4.112.2.0, а не Oracle.DataAccess 4.121.1.0. – Kiquenet

+0

Чтобы использовать, вызовите 'var results = this.GetType(). GetReferencesAssembliesPaths();'. – Contango

2

type.Assembly.GetReferencedAssemblies() возвращает все узлы, на которые ссылаются сборки, в котором объявлен тип. Это не означает, что сборки, которые вы получите с помощью этой функции, имеют что-то общее с данным типом.

+0

Да, это точно одна из моих проблем с этим методом. – DxCK

+0

Проблема об этом: проект проекта библиотеки Oracle.DataAccess 4.112.2.0, но во время выполнения загружает из GAC Oracle.DataAccess 4.121.1.0. Assembly.GetReferencedAssemblies() дает мне Oracle.DataAccess 4.112.2.0, а не Oracle.DataAccess 4.121.1.0. – Kiquenet

 Смежные вопросы

  • Нет связанных вопросов^_^