Косвенный доступ к сборке через отражение - PullRequest
1 голос
/ 24 ноября 2010

ОК, у меня есть следующий бит кода:

Assembly assembly = Assembly.LoadFile("W:\\AssemblyFoo.dll");

foreach (Type type in assembly.GetExportedTypes())
{
    foreach (object attribute in type.GetCustomAttributes(false)) //Exceptio on that line
    {
        string attributeString = attribute.ToString();
    }
}

Код выдает следующее исключение: Не удалось загрузить файл или сборку 'AssemblyBar, Версия = 1.0.0.0, Культура = нейтральный, PublicKeyToken =null 'или одна из его зависимостей.Системе не удается найти указанный файл.

Проблема в том, что один из атрибутов находится в AssemblyBar, на который ссылается AssemblyFoo, но не напрямую на сборку текущего проекта (ProjectBaz).Я бы предпочел не ссылаться на AssemblyBar непосредственно в ProjectBaz, так как AssemblyFoo выбирается пользователем.Как правильно это сделать?Я почти уверен, что упускаю что-то простое.

Я знаю, что это возможно, поскольку Reflector делает это.

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

Mono's Cecil

Вы можете обойти проблему, не загружая сборки через встроенные средства отражения, используя такой инструмент, как Mono.Cecil вместо.У меня был хороший опыт применения его для анализа задач.

С сайта Cecil:

с помощью Cecil вы можете загружать существующие управляемые сборки, просматривать все содержащиеся в них типы, изменять их на лету и сохранять обратно на диск измененную сборку..

Метаданные CCI

В качестве альтернативы Сесилу вы можете рассмотреть Метаданные CCI от Microsoft Research ,Я не использовал этот инструмент, поэтому не могу комментировать, как он складывается с Сесилом.

Надеюсь, это поможет.

0 голосов
/ 24 ноября 2010

MemberInfo.GetCustomAttributesData () была введена в .NET 4, чтобы вы могли исследовать пользовательские атрибуты без необходимости их создания.

ОБНОВЛЕНИЕ: При более внимательном рассмотрении MemberInfo.GetCustomAttributesData (), хотя он не создает экземпляры атрибутов, он все равно должен загрузить сборку. Мои извинения.

Другой возможный путь для расследования будет Моно Сесил . Вы можете загрузить сборку Mono.Cecil и использовать ее с .NET Framework, а не только с Mono. Это намного мощнее, чем System.Reflection и Reflection.Emit. Согласно домашней странице:

Сесилу не нужно загружать сборку или иметь совместимые сборки для анализа изображений.

Это звучит так же, как то, что вы пытаетесь сделать.

0 голосов
/ 24 ноября 2010

Вы можете включить AssemblyBar в каталог bin, чтобы его мог загрузить clr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...