Как ссылаться на framework 4.0 dll в проекте, ориентированном на 3.5 в VS2008 - PullRequest
4 голосов
/ 17 марта 2012

У меня есть dll, созданная в VS2010 с использованием фреймворка 4.0 (да, это полный 4.0, НЕ профиль клиента).Я хотел бы сослаться на него в проекте VS2008 (то есть я не могу переназначить ссылочный проект на 4.0, даже если бы захотел), и обновление этого проекта до VS2010 не вариант.

Я понимаю, почемуЕсть проблемы со ссылками на 4.0 'проекты' в проектах 3.5, но я не понимаю, почему у меня должна быть проблема со ссылкой на 4.0 dll в проекте 3.5.И, насколько я знаю, это может и не быть проблемой, но я не могу думать о том, что еще это может быть.

Я пытаюсь использовать Fasterflect (http://fasterflect.codeplex.com/), который в значительной степени опирается на функции 4.0 вмой проект 3.5 (и опять-таки, моя компания не готова выложить деньги на VS2010, поэтому я не могу это изменить). Сначала все шло нормально, пока я не попытался скомпилировать, а затем ошибки о том, что сборка Fasterflect не подписанаЯ загрузил реальный исходный код, подписал его, перекомпилировал и сослался на мою недавно подписанную сборку. Проблема в том, что теперь он отображает символ предостережения и говорит:

У разрешенного файла естьНеверное изображение, нет метаданных или иным образом недоступен. Не удалось загрузить файл или сборку 'C: .... \ Fasterflect.dll' или одну из ее зависимостей. Эта сборка построена средой выполнения, более новой, чем текущая загруженная среда выполнения, и не можетбыть загруженным.

Я попытался следовать предложенному здесь ответу: http://social.msdn.microsoft.com/Forums/en/clr/thread/36b1a209-55d5-4323-91dc-0919ba2e1d03. Однако я получил другое сообщение об ошибкекогда я это делаю:

Не удалось найти информацию о схеме для элемента 'selectedRuntime'.C: .... \ DynamicSql \ App.config

И я тоже не могу понять эту ошибку.

Конечно, должен быть НЕКОТОРЫЙ способ для меняиспользовать эту DLL в VS2008 ??

1 Ответ

7 голосов
/ 17 марта 2012

Когда вы создаете проект, нацеленный на конкретную версию платформы, вы сообщаете компилятору, какую версию библиотек инфраструктуры и среды выполнения установил компьютер, на котором будет запускаться проект.Например, System.dll в 3.5 и System.dll в 4.0 - это не одно и то же, так как System.dll в 2.0 и 3.5 не совпадают.

Теоретически, вы не можете гарантировать прямую совместимость (3.5 ссылается на 4.0), поскольку сборка 4.0 может использовать API, которых нет в 3.5.Аналогично, вы не можете гарантировать обратную совместимость 2.0 в 4.0, потому что некоторые API могли быть устаревшими и удалены.

На практике 4.0 обладает достаточной обратной совместимостью с 3.5, что позволяет вам ссылаться на сборки 3.5 в приложениях 4.0 с некоторыми оговорками (иногда вам нужно добавить директиву в файл конфигурации,с момента сборки загрузка в 4.0 изменилась с 3.5).К сожалению, 3.5 не имеет прямой совместимости с 4.0 из-за огромного количества новых API, представленных 4.0, поэтому я не думаю, что вы можете ссылаться на сборки 4.0 из 3.5.

Вы видите, чтоисключение информации схемы по этой причине.«supportRuntime» - это элемент конфигурации, который был представлен в .NET 4.0.Но так как вы ссылаетесь на сборку в 3.5, версия .NET 3.5 System.Configuration, которая анализирует файл конфигурации, не распознает этот элемент и, следовательно, выдает исключение.

Единственный способ, вероятно,(1) изменить исходный код и пересобрать, исправив все вызовы API для библиотек 4.0, которые не работают в 3.5, или (2) сделать то же самое, но на уровне IL, генерируя новую сборку (вы можетесделать это с al.exe).

...