Как добавить .Net3.5 dll в проект .Net2.0? - PullRequest
6 голосов
/ 05 мая 2010

У меня есть dll, которая основана на .net 3.5 - она ​​использует внутренне, например, Linq, но представленный API-интерфейс прост, ничего особенного. Поскольку дженерики C # разрешаются во время компиляции, я предполагаю, что для вызывающей стороны все, что он считает, это API (все открытые части).

Однако, когда я пытаюсь использовать эту dll из проекта net2.0, я получаю информацию, что на dll нельзя ссылаться, поскольку для dll или одной из ее зависимостей требуется более поздняя версия .net framework.

Я могу установить любую нужную версию .net на целевом компьютере (когда установлено все приложение), но не могу изменить версию .net для самого проекта.

Итак: как решить эту проблему? При добавлении Cll DLL в этот проект у меня не было таких проблем, поэтому C # DLL автономны или нет?

Ответы [ 6 ]

9 голосов
/ 05 мая 2010

C # dll должен иметь .Net runtime для запуска, так как они не скомпилированы в машинный код. В этом случае DLL говорит, что требует Net 3.5, поэтому весь ваш проект должен будет использовать 3.5 или выше.

Чтобы сохранить ваш проект как Net 2.0, вам нужно создать еще один исполняемый файл, содержащий библиотеку DLL 3.5 и взаимодействующую между отдельными процессами.

DLL-библиотека C работала так, как она скомпилирована в собственный код и не требует .Net framework. (или, по крайней мере, не выше версии 2.0)

6 голосов
/ 05 мая 2010

Я использую System.Core и новые System.Web.Extensions (например) из 3.5 в приложении ASP.NET 2.0 (используя VS2005) для пока сейчас без проблем. Подобно тому, что Скотт Хансельман писал о здесь . Так что да, это возможно.

.NET 3.5 по-прежнему работает в той же среде CLR, что и .NET 2.0. Так что во время выполнения все по-прежнему. (Предполагая, что вы отследили все зависимости и скопировали эти библиотеки DLL 3.5 в свою папку bin.)

Единственным реальным ограничением являются возможности языка C #, которые вы можете использовать во время разработки. Например, var, методы расширения или синтаксис запроса LINQ.

2 голосов
/ 05 мая 2010

Если вы используете библиотеки .NET 3.5, то требования вашего приложения должны быть такими, чтобы любой пользователь его API также использовал .NET 3.5.

Единственный способ обойти это, если вы упаковываете все зависимости вашего приложения вместе с ним. Это означает, что библиотеки, которые использует ваше приложение, зависят от .NET 3.0 и 3.5.

Однако я не уверен в законности удаления фрагментов .NET-фреймворков и упаковки их в приложение. Я бы прочитал EULA, прежде чем делать что-то подобное. ИМО, это не стоит хлопот; просто установите 3.5, попросите пользователей установить 3.5 и покончите с этим или используйте только 2.0 функции и библиотеки. По крайней мере, подобные хакерские атаки приведут вас к еще большей боли при развертывании, если в будущем появятся обновления инфраструктуры.

В любом случае ваше приложение будет работать на .NET 2.0, так как 3.0 и 3.5 - это просто дополнительные библиотеки поверх среды выполнения 2.0 и библиотеки (как упомянул Крейг), пока все ваши зависимости существуют.

2 голосов
/ 05 мая 2010

Если вы используете linq для объектов, вы можете использовать Linq Bridge: http://www.albahari.com/nutshell/linqbridge.aspx

это реализация Linq для объектов для .net 2.0.

Вам все равно придется компилировать с использованием vs2008, но в этом случае вы можете компилировать с .net 2.0 в качестве целевой платформы. (Это потому, что компилятор C # 3 понимает предложения linq, даже если вы нацелены на .net 2.0, в этом случае он просто разрешит вызовы linqbridge вместо библиотек .NET 3.5)

1 голос
/ 05 мая 2010

Ничего особенного, но есть способы, чтобы код счастливо работал вместе (в порядке предпочтения):

1) Обновите оба проекта до 3,5

Если я правильно вас понимаю, ваша Программа .net FW 2.0 будет зависеть от библиотеки 3.5, что означает, что для работы всех функций Программы теперь требуется FW 3.5. Поскольку вы заявляете, что у вас есть код и полномочия для перекомпиляции Программы и установки любого FW при развертывании, вы можете обновить его до 3.5. Звучит просто, но так как вы этого не сделали, то, я думаю, у вас есть веские причины (как и другие программы, находящиеся выше цепочки вызовов, которые вы не можете обновить до 3.5 / перекомпилировать.)

2) Обойти компилятор FW2.0

Сборка Программы при ссылке на версию 2.0 библиотеки (или пустышку, просто предоставляя публичный API). Создайте версию 3.5 библиотеки отдельно без программы (следовательно, устраните необходимость ссылаться на неправильную сборку FW) и разверните версию 3.5 вместо версии 2.0. Поскольку 2.0 и 3.5 используют одну и ту же среду CLR, то одурачивания компилятора достаточно. Пока в развертывании установлен FW 3.5, все должно быть хорошо. Примечание: все в порядке, даже если на компьютере развертывания присутствует только .net 2.0, а пользователь не вызывает классы .net 3.5. Если он это сделает, произойдет сбой;)

3) понизить версию библиотеки до 2,0

если вы используете только некоторые классы .net FW, вы можете продолжать использовать компилятор 2.0, добавив эти недостающие будущие сборки в проект. (это решение по ссылке Хансельмана, которой поделился Крейг). Как уже отмечалось, вы потеряете синтаксический сахар 3.5, такой как vars.

Выберите тот, который подходит вашей ситуации лучше.

1 голос
/ 05 мая 2010

C # DLL не являются автономными. Если вашей DLL 3.5 требуется LINQ, это зависит от системных сборок из 3.5 (точнее 3.0), поэтому все приложение зависит от этой версии.

Вы можете загрузить сборку 3.5 динамически и использовать отражение, чтобы получить доступ к нужным функциям. Это требует некоторых накладных расходов, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...