.NET 4 загружает сборки, отличные от .NET 3.5 - PullRequest
16 голосов
/ 27 января 2012

После перехода на .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 ]

1 голос
/ 14 февраля 2012

Наверное, нет (из опыта). Были похожие проблемы на более раннем этапе (не помню, если это было 2.0 -> 2.1 или 3.0 -> 3.1., Но это было некоторое время назад). У нас были машины, сообщавшие об установке более ранней версии, и сбой. Когда мы вычистили сетевые установки и фактически установили более низкую версию, а затем обновление, все работало нормально. Microsoft может вытащить патч. Я был бы склонен фактически поднять это с MS. У вас, казалось бы, хорошо обнаруженная ошибка, и в таких обстоятельствах поддержка контракта или нет, они очень неохотно заканчивают тем, что обвиняют вас. (Мой опыт в любом случае)

0 голосов
/ 22 февраля 2012

Когда вы переносите свое приложение с .NET 3.0, с 3.5 на 4.0, вам нужно внешне включить этот mylib.dll в ваш проект и скомпилировать его, или, если возможно, у вас есть исходный код сборки, затем измените его на .net 4,0

...