Я использую библиотеку SharpShell , чтобы разработать простое расширение оболочки (лист свойств) для отображения некоторой информации для сборок .NET, см .:
![enter image description here](https://i.stack.imgur.com/3koub.png)
Это расширение оболочки и 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