Я использую библиотеку SharpShell для разработки простого расширения оболочки (страницы свойств) для отображения некоторой информации. для сборок .NET см .:
Это расширение оболочки и сама SharpShell не имеют отношения к этому вопросу, а предназначены для объяснения моего сценария, чтобы вы могли лучше понять мой вопрос.
Мой проект скомпилирован как режим Любой ЦП, поэтому для управления загрузкой сборок x86, x64 и любых сборок ЦП в моей программе я использую перегрузку функции 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, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a или одну из его зависимостей. Указанное имя сборки или кодовая база недействительны. (Исключение из HRESULT: 0x80131047)
(обратите внимание, что Assembly.ReflectionOnlyLoad()
также вызовет то же исключение.)
Однако я могу успешно загрузить 64-разрядную версию той же сборки. Обратите внимание, как я уже сказал, я могу загрузить в свою программу большинство 32-битных сборок.
Если я скомпилирую свой проект как x86, то я смогу успешно загрузить эту сборку. Но мой проект должен компилироваться как Any CPU (чтобы иметь возможность обрабатывать загрузку сборок x86 и x64 ... поскольку я не знаю лучшего подхода).
Я хотел бы знать, почему я не могу загрузить эту конкретную сборку, и какой жизнеспособный подход к решению этой проблемы.
Здесь вы можете скачать библиотеки, если хотите протестировать:
http://www.mediafire.com/file/8h9256w02b2j3dj/System.Web.dll.zip/file
Assembly.ReflectionOnlyLoadFrom()
вместоAssembly.Load()
? - person NineBerry   schedule 09.09.2018