Проблемы с выполнением скомпилированного кода 3.5 на сервере, который имеет только 2.0-структуру

Я не могу заставить мое приложение работать и работать на моем dev-сервере, и я не уверен, почему.

Я скомпилировал свой код в VS 2008 с целевой структурой 3.5. Я использую 3.5 в основном потому, что я реализовал LINQ довольно широко. Компиляция и запуск локальных без проблем.

Повесьте трубку, что мой сервер имеет только 2.0.Net framework и обновление до 3.5, по-видимому, не произойдет.

У меня сложилось впечатление, что после некоторых исследований, пока я пытался выполнить скомпилированный код, серверу не понадобится 3.5.

Сегодня я пытаюсь опубликовать на сервере, и я не могу пройти эту ошибку в своем WEB.CONFIG

Ошибка конфигурации

Сообщение об ошибке Parser: недопустимые дочерние узлы.

providerOption name= Значение "CompilerVersion" = "v3.5" /

EDIT ADD ON QUESTION: Я видел некоторые сообщения о возможностях установки ссылок на "copy local", которые могут позволить мне запускаться на сервере 2.0. Мысли?

9 ответов

Вы можете просто скопировать по 3.5 dll на сервер. Вы можете абсолютно запустить код 3.5 на сервере 2.0.


Вы правы в том, что 3.5 работает на 2.0 CLR, но 3.5 содержит библиотеки, и если вы использовали какой-либо из них, вам не повезло, если вы не установили 3.5 на этом сервере.

Существует множество возможностей для корректной работы программы 3.5 только на версии 2.0, поэтому я бы подумал о понижении производительности программы или обновлении сервера.

Примечание о копировании локального. Даже если вы скопируете все 3.5 библиотеки, которые использует ваше приложение, нет никакой гарантии, что она будет работать, и, скорее всего, она не будет. Тем не менее, распространение библиотек с вашим приложением явно запрещено лицензией .NET.

Поскольку вы заявили, что используете LINQ, единственным законным способом запуска вашего приложения является установка лицензии 3.5.

Или вы можете переписать свое приложение, используя только 2.0.


Я уверен, что LINQ является одной из вещей, которая требует 3.5. Многие другие вещи, такие как лямбда-выражения и т.д., Являются просто обманом компилятора.

Поскольку System.Linq - это функция 3.5, инфраструктура должна быть той версией.

Хорошим способом для определения было бы изменить целевую структуру на 2.0 и посмотреть, будет ли она строить.


Код, скомпилированный с 3.0 или 3.5, может работать в среде 2.0, но только если вы не используете библиотеки, специфичные для платформы 3.0+. Одним из хороших способов найти причину отказа вашего кода является переход вашей цели на 2.0 и изменение вещей, чтобы она компилировалась. Поскольку одна из ваших целевых установок -.NET 2.0, вам придется писать код .NET 2.0; это не уникально для .NET. Раньше при написании приложения, которое выполнялось как в Win95, так и в WinNT, была задействована дополнительная работа для разработчика, чтобы убедиться, что соответствующий API был использован.

Технически, 3.5-целевой код может работать на 2.0 без проблем, но есть некоторые проблемы, которые вы должны наблюдать. Если что-либо получает доступ к тому, что недоступно в .NET 2.0, это провалится. Это не происходит, когда приложение запускается, это происходит, когда приложение пытается выполнить вызов. Я протестировал это, создав консольное приложение, которое делает немного вывода, а затем пытается отобразить окно WPF. Вывод выполнен, но приложение выдает исключение, когда оно пытается отобразить окно на машине, но ничего, кроме .NET 2.0.

Еще одна проблема заключается в том, что VS 2008 на самом деле поставляется с .NET Framework 2.0 SP1, и в SP1 существует несколько типов и методов, которые не входят в обычную среду 2.0. Visual Studio не будет отмечать эти методы как небезопасные.

Наконец, если это веб-приложение, файл web.config по умолчанию для проектов с 3.5-мишенями сильно отличается от файла web.config для проектов с поддержкой 2.0. Убедитесь, что вы распространяете совместимый файл web.config. Вероятно, это проблема, с которой вы сталкиваетесь. Дешевым обходным решением может стать изменение вашей цели на .NET 2.0, копирование этого web.config и использование в этом случае. Имейте в виду, что если вы используете какие-либо 3.0 + -специфические языковые функции или типы, ваш код по-прежнему будет терпеть неудачу, но это должно помочь вам пройти через web.config.


Вы не сможете запустить код, настроенный на 3.5 на сервере, если вы не установите на нем 3.5.

Проблема заключается не в вашем коде, а в том, что требуемые библиотеки будут отсутствовать.


Это невозможно. Хотя CLR не изменилась (например, между v1.1 и v2.0). Библиотеки имеют. Вы не можете запустить приложение 3.5, в котором не установлено 3.5 fraework. Все функции Linq становятся возможными благодаря структуре 3.5.


Вы можете использовать некоторые функции С# 3, ориентируясь на .NET 2.0. Его языковые функции, которые к тому времени, когда они были скомпилированы IL, будут работать в среде CLR 2.0 независимо от того, является ли эта среда CLR частью установки 2.0 или более поздней версии.

Следовательно, вы можете использовать анонимные типы, методы расширения и выражения лямбда, но как только вы будете делать такие вещи, как LINQ, вам понадобятся внешние библиотеки, которые являются частью 3.5

Если вы только делаете LINQ to Object, вы можете добавить LINQBridge в свой дистрибутив.

Еще одна проблема, с которой вы можете столкнуться, заключается в том, что вы отправляете веб-приложение, содержащее исходный код, например код за файлами, в код строки и .cs в папке App_Code.

Вы можете в конечном итоге загрузить исходный код С#, который компилируется на машине разработки с компилятором С# 3, но не может скомпилироваться на сервере, оборудованном только С# 2. В этом случае вы также не можете использовать какие-либо новые языковые функции.

Чем хуже то, что спецификация среды .NET 2.0 в качестве цели в Visual Studio не останавливает вас, используя функции языка С# 3. Вы не получаете предупреждений о том, что такой синтаксис не будет компилироваться на машине 2.0.

Следовательно, если вы отправляете такое веб-приложение, сначала вам нужно скомпилировать почти все.


Я просто собирался оставить комментарий от моего представителя не совсем там. До сих пор я согласен с толпой и считаю, что ответ lassevk лучший, поэтому, пожалуйста, дайте ему репутацию для этого. Один из них, о котором я хотел, чтобы вы знали об этом, заключается в том, что после установки 3.5 на сервере IIS (6 или лучше). Когда вы перейдете к диспетчеру IIS и щелкните правой кнопкой мыши на своем веб-сайте, чтобы открыть вкладку ASP.Net. Вы увидите ПОСЛЕ установки 3.5 Framework, если нет доступной версии 3.5. Он все равно покажет это как 2.0.50727. Не беспокойтесь об этом, он все равно будет работать нормально. Из-за этого несоответствия (спасибо Microsoft) возникла некоторая путаница. На самом деле, я думаю, именно поэтому вы, возможно, подумали, что 2.0 будет отлично работать с вашим кодом 3.5. Надеюсь, это поможет, и кто-нибудь, пожалуйста, отредактируйте это, чтобы он имел больше смысла.


Одна ошибка в Web.Config. Опубликованный Web.Config настроен таким образом, чтобы разрешить компиляцию с .NET 3.5, поэтому он включает информацию о поставщике сборки.

Кроме того, ваш код не будет запущен. Используя LINQ, вы ссылаетесь на сборки, которые не существуют в .NET 2.0.

licensed under cc by-sa 3.0 with attribution.