С переходом на .net 4 мы столкнулись с проблемой нашей библиотеки. Предположим, у нас есть библиотека MyLib.dll, и она ссылается на Interop-сборку 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 пытается загрузить что-то ненужное? Есть ли способ исправить это без перекомпиляции кода или добавления отсутствующего файла?