.NET 4 загружает сборки, отличные от .NET 3.5

При переходе на .net 4 мы начали сталкиваться с проблемой с нашей библиотекой. Предположим, у нас есть библиотека MyLib.dll, которая ссылается на сборку взаимодействия Interop.dll. Interop.dll имеет ссылку на MissingInterop.dll.

Таким образом, ссылки могут отображаться как: MyLib.dll -> Interop.dll -> MissingInterop.dll

В MyLib.dll мы используем только часть классов из Interop.dll, поэтому мы никогда не вызываем ничего, что требуется MissingInterop.dll, а в .net 3.5 он работает нормально. Вот почему мы не поставляем MissingInterop.dll с MyLib.dll.

Когда мы используем MyLib.dll из процесса, запущенного под .net 4, приложение не работает со следующим исключением:

FileNotFoundException: «Не удалось загрузить файл или сборку MissingInterop.dll, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null 'или одна из его зависимостей. Система не может найти указанный файл. "«

Также я заметил, что Interop.dll ссылается на другие отсутствующие библиотеки DLL, но .net не пытается их загрузить. И я нашел разницу. Некоторые типы из MissingInterop.dll используются в параметрах метода в Interop.dll, в то время как типы из других недостающих библиотек используются только как типы, возвращаемые методом, то есть в Interop.dll я вижу:

  Class C1
     MethodA : void (valuetype [MissingInterop]MissingAssembly.TypeA&)
  Class C2
     get_Status : valuetype[AnotherMissingInterop]AnotherMissingAssembly.TypeB()

и .NET 4 пытается загрузить MissingInterop. dll, но не пытается загрузить AnotherMissingInterop.dll.

.NET 3.5 не пытался загрузить ни MissingInterop.dll или AnotherMissingInterop, потому что они не используются в пути выполнения.

Я знаю, что в .NET 4 есть новый Fusion, но я нигде не нашел описанных таких критических изменений. Кто-нибудь знает, почему .NET 4 пытается загрузить то, что не нужно? Есть ли способ исправить это без перекомпиляции кода или добавления отсутствующего файла?

16
задан Puterdo Borato 19 February 2012 в 10:29
поделиться