Почему файл load.file Reflection.assembly не загружает все библиотеки DLL? - PullRequest
2 голосов
/ 18 июля 2010

Я использую LoadFrom (), чтобы загрузить библиотеки DLL, но по какой-то причине эта функция загрузки работает не на всех библиотеках DLL, Я хочу загрузить 3000 DLL, чтобы получить от каждого атрибут авторского права.

мой код:

    class ReverseDLL
{
    private Assembly assembly;
    private AssemblyDescriptionAttribute desc;
    private AssemblyTitleAttribute title;
    private AssemblyCopyrightAttribute copyRight;

    public string getCopyright(string path)
    {
        try
        {
            //assembly = System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(path));
            assembly = System.Reflection.Assembly.LoadFrom(path);//"C:\\Windows\\winsxs\\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\\msvcm90d.dll");//path);// LoadFrom(path);

                desc = (AssemblyDescriptionAttribute)
                AssemblyDescriptionAttribute.GetCustomAttribute(
                assembly, typeof(AssemblyDescriptionAttribute));

                title = (AssemblyTitleAttribute)
                AssemblyTitleAttribute.GetCustomAttribute(
                assembly, typeof(AssemblyTitleAttribute));

                copyRight = (AssemblyCopyrightAttribute)AssemblyCopyrightAttribute.GetCustomAttribute(assembly, typeof(AssemblyCopyrightAttribute));
        }
        catch
        {
              this.copyRight = new AssemblyCopyrightAttribute("");
        }

        if (this.copyRight == null)
            this.copyRight = new AssemblyCopyrightAttribute("");

        return copyRight.Copyright;
    }
}

Ответы [ 3 ]

4 голосов
/ 18 июля 2010

Я не знаю о проблеме отражения, если вы не предоставите больше информации (например, об ошибке), но вы могли бы также попытаться получить доступ к самому файлу:

string copyright = FileVersionInfo.GetVersionInfo(path).LegalCopyright;

Этообращается к метаданным файловой системы (как вы могли бы видеть в проводнике) и имеет преимущество работы как для управляемых, так и для неуправляемых библиотек;, но требует, чтобы мета-данные существовали ( не смотрит на атрибут).

Редактировать: быстрая проверка показывает, что (как и ожидалось)компилятор выполняет проверку этого атрибута и правильно заполняет метаданные файла.

0 голосов
/ 18 июля 2010

Использование рефлексии не является оптимальным подходом, так как некоторые из DLL могут иметь зависимости, которых у вас нет.

Использование парсера метаданных может дать вам то, что вы хотите,

http://ccimetadata.codeplex.com/

http://www.mono -project.com / Cecil

Способ, о котором упоминал Марк, не работает для большинства метаданных .NET.

0 голосов
/ 18 июля 2010

Вы пытались остановиться на исключениях?Ctrl + Alt + E, останавливать на исключениях платформы, когда они генерируются.Сообщение об исключении должно дать вам некоторую информацию о том, почему DLL не может быть загружена.

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