.NET 4 загружает сборки, отличные от.NET 3.5
С переходом на.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 пытается загрузить то, что не нужно? Есть ли способ исправить это без перекомпиляции кода или добавления отсутствующего файла?
2 ответа
Когда вы переносите свое приложение с.NET 3.0, 3.5 на 4.0, вам нужно внешне включить этот mylib.dll в ваш проект и скомпилировать его, или, если возможно, у вас есть исходный код сборки, а затем изменить его на.net 4.0.
Вероятно, нет (из опыта). Были похожие проблемы на более раннем этапе (не помню, если это было 2.0 -> 2.1 или 3.0 -> 3.1., Но это было некоторое время назад). У нас были машины, сообщавшие об установке более ранней версии, и сбой. Когда мы вычистили сетевые установки и фактически установили более низкую версию, а затем обновление, все работало нормально. Microsoft может вытащить патч. Я был бы склонен фактически поднять это с MS. У вас, казалось бы, хорошо обнаруженная ошибка, и в таких обстоятельствах поддержка контракта или нет, они очень неохотно заканчивают тем, что обвиняют вас. (Мой опыт в любом случае)