.NET 4 загружает сборки, отличные от .NET 3.5 - программирование
Подтвердить что ты не робот

.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, Version = 1.0.0.0, Culture = neutral, 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 пытается загрузить что-то, что не нужно? Есть ли способ исправить это без перекомпиляции кода или добавления отсутствующего файла?

4b9b3361

Ответ 1

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

Ответ 2

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