Не удается загрузить конкретную 32-битную сборку через Reflection - PullRequest
0 голосов
/ 09 сентября 2018

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

enter image description here

Это расширение оболочки и SharpShell само по себе не имеют отношения к этому вопросу, но для объяснения моего сценария, чтобы вы могли лучше понять мой вопрос.


Мой проект скомпилирован как Любой режим CPU , затем для управления загрузкой x86, x64 an Любые сборки CPU в моей программе я использую перегрузку функции Assembly.Load(), которая принимает байты необработанной сборки в качестве уникального аргумента:

Assembly asm = Assembly.Load( File.ReadAllBytes(filepath) );

Я протестировал его с dll и исполняемыми файлами архитектуры x86 и x64, и с любым процессором, он работает нормально ... за исключением проблемы, которую я объясню.

Проблема в том, что по какой-то причине я игнорирую, что она не работает для некоторых сборок x86, например, когда я пытаюсь загрузить сборку x86: System.Web.dll (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a), функция Assembly.Load() выдает исключение. Это НЕ BadImageException, это FileLoadException с таким сообщением об ошибке:

Не удалось загрузить файл или сборку 'System.Web, версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a 'или один из ее зависимостей. Указанное имя сборки или кодовая база недопустимы. (Исключение из HRESULT: 0x80131047)

(обратите внимание, что Assembly.ReflectionOnlyLoad() также выдаст то же исключение.)

Тем не менее, я могу успешно загрузить версию x64 той же сборки. Обратите внимание, что, как я уже сказал, я могу загрузить большинство 32-битных сборок в моей программе.

Если я скомпилирую свой проект как x86, тогда я могу загрузить эту сборку с успехом. Но мой проект должен быть скомпилирован как Любой ЦП (чтобы иметь возможность обрабатывать загрузку как x86, так и x64 сборок ..., поскольку я не знаю лучшего подхода).

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

Здесь вы можете скачать dll, если хотите его протестировать:

http://www.mediafire.com/file/8h9256w02b2j3dj/System.Web.dll.zip/file

1 Ответ

0 голосов
/ 09 сентября 2018

Невозможно загрузить сборки для архитектуры процессора, отличной от текущего процесса, используя Assembly.Load().

Используйте Assembly.ReflectionOnlyLoadFrom() вместо.

В простом демонстрационном приложении, которое запускается как 64-битное, я вижу следующее поведение:

var lAss = Assembly.Load(File.ReadAllBytes(@"C:\Windows\Microsoft.NET\assembly\GAC_32\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll"));
MessageBox.Show(lAss.Location);

Это вызывает исключение, как описано в вопросе.

var lAss = Assembly.ReflectionOnlyLoadFrom((@"C:\Windows\Microsoft.NET\assembly\GAC_32\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll"));
MessageBox.Show(lAss.Location);

Это не вызывает исключения и показывает окно сообщения.

...