Почему я получаю "Один или несколько типов, необходимых для компиляции динамического выражения, не могут быть найдены"?

У меня был проект, который я обновил из

  • .NET 3.5 MVC v2 to
  • .NET 4.0 MVC v3

Компиляция Я получаю сообщение об ошибке при попытке использовать или установить свойство @ViewBag.Title.

Невозможно найти один или несколько типов, необходимых для компиляции динамического выражения. Вам не хватает ссылок на файлы Microsoft.CSharp.dll и System.Core.dll?

Я сделал следующее

  • После выполнения шагов обновления
  • Установите целевую структуру на вкладке "Проект/Свойства/Приложение" в .NET Framwework 4
  • Добавлена ​​структура System.Core вручную
  • Добавлена ​​структура Microsoft.CSharp
  • Добавлена ​​структура System.Xml
  • Добавлена ​​структура System.Xml.Linq
  • Убедитесь, что мой Web.Config прав (он написан поверх Web.Debug.Config и т.д.)
  • Создал модель, контроллер и Razor View
  • Создайте __Layout.cshtml _

Я нахожусь в убытке относительно того, что еще делать?

EDIT:

Я заметил, что в GAC Gui есть System.Core 3.5.0.0, но не System.Core 4.0.0.0. Означает ли это, что его путают и все еще используют предыдущую версию? Или я не понимаю GAC?

EDIT:

Мой web.config выглядит следующим образом

...
<compilation debug="true">
    <assemblies>
        <add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
    </assemblies>
</compilation>
....
<pages>
    <controls>
    <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</controls>
<namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.WebPages"/>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
    <add namespace="System.Linq" />
    <add namespace="System.Collections.Generic" />
</namespaces>
</pages>
....

Ответ 1

Хорошо, я начал работать со следующими шагами.

  • В конфигурационном файле я изменил <compilation debug="true"> на <compilation debug="true" targetFramework="4.0"> в разделе system.web
  • В конфигурационном файле я изменил <providerOption name="CompilerVersion" value="v3.5" /> на <providerOption name="CompilerVersion" value="v4.0" /> в разделе компиляторов
  • В Global.asax.cs я добавил ViewEngines.Engines.Add(new RazorViewEngine()); в метод Application_Start()

и я думаю, что это было.

Ответ 2

Для чего это стоит, когда это произошло со мной (в проекте, преобразованном автоматически с MVC2 на MVC3), все, что мне нужно было сделать, это добавить ссылку на проект для Microsoft.CSharp. В моем случае у web.config уже были упомянутые здесь ссылки 4.0, я полагаю, любезно предоставлено обновление script.

Ответ 3

Вам нужно добавить ссылку на версию Microsoft.CSharp.dll - v4.0.30319 в проект. Что доступно в C:\Program Files\Reference Assemblies\Microsoft\Framework \.NETFramework\v4.0\Microsoft.CSharp.dll после завершения VS 2010

Ответ 4

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

ViewEngines.Engines.Add(new RazorViewEngine());

к методу Application_Start() в global.asax.cs.

Ответ 5

Похоже, вы импортируете System.Core 3.5 в свой web.config. Вам нужно импортировать System.Core из фреймворка 4.0, потому что ViewBag требует пространство имен System.Dynamic.

На моей машине это выглядит как System.Core v4.0.30319

Ответ 6

Я решил это следующим образом:

Сначала я заметил использование gacutil (Global Assembly Cache Utility), в котором содержались две ссылки на System.Core, от одной до версии 4.0 и от одной до версии 3.5. Очевидно, что внутри просмотров бритвы, даже если в проекте у меня была правильная ссылка на версию 4.0, она все еще использовала версию 3.5 и почему я получал ошибку о динамических типах. Чтобы проверить, откроется ли ваше приложение как администратор командной строки Visual Studio и выполните:

gacutil -l System.Core

Чтобы удалить ссылку на старую версию System.Core, я сделал следующие шаги:

- cd %systemroot%\assembly\

Здесь у вас может быть больше одного "gac" -каталога, поэтому вам придется искать в каждом, чтобы найти ваш компонент. Для меня это было в каталоге "gac_MSIL".

- cd gac_msil
- cd System.Core
- cd <assembly version number>__<public key token>
- erase *.* Say "y" to are you sure.
- cd ..
- rd <assembly version number>__<public key token>
- cd ..
- rd System.Core

Теперь я снова открыл свое решение в visual studio и ошибка исчезла, он правильно ссылается на System.Core 4.0, и я больше не получаю динамические ошибки:)

Надеюсь, это поможет и вам, Лучший, N.

Ответ 7

Это была моя резолюция:

1) Перейдите к ссылкам проекта

2) Щелкните правой кнопкой мыши на Microsoft.CSharp → Свойства

3) Измените Копировать Локальный на False, если у вас есть значение True.

Ответ 8

Если вы видите это сообщение в своих MVC-представлениях, вам нужно добавить ссылку в Views\web.config следующим образом:

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        (... other references ...)
        <add namespace="Microsoft.CSharp" />  <-- Add this
        (...)
      </namespaces>
    </pages>
  </system.web.webPages.razor>

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

Ответ 9

Проект по умолчанию в Visual Studio 2010 должен иметь ссылки на Microsoft.CSharp и System.Core.

Если они не указаны в вашем проекте, вам нужно добавить их, и ошибки исчезнут.

Ответ 10

Woow!

Я почти год опаздываю, но все же думаю, что я должен ответить на основании моих результатов (13 июля 2013 года в формате 7: 15p PST), связанных с сообщением об ошибке. Это может быть полезно для ребят, которые ищут ответ на сообщение об ошибке:

"One or more types required to compile a dynamic expression cannot be found."

поэтому, пожалуйста, прочитайте: У меня было подобное сообщение об ошибке, когда я реализовал System.Dynamic в своем коде. Веб-приложение работает плавно, так как у меня была правильная настройка в web.config(targetframework), но когда я поместил app_code в отдельную dll, тогда он начал бросать ошибки во время компиляции. Обратите внимание, что у меня не было app.config в моей dll, поэтому он НЕ МОЖЕТ быть зависим от конфигурации, когда у вас есть это в отдельном проекте DLL, но ссылка на правильную dll.

Я понял, что правильный Microsoft.CSharp.dll был в "C:\Windows\Microsoft.NET\Framework\v4.0.30319", и моя dll скомпилирована успешно.

Ответ 11

Для меня не вышеописанное, вместо установки Copy Local = True решена проблема

Ответ 12

У меня была эта проблема, когда я обновлял версию MVC в своем проекте. Проблема заключалась в директиве assemblyBinding, так как Nuget забыл ее обновить.

Мне пришлось изменить

  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
  </dependentAssembly>

к

  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
  </dependentAssembly>

Ответ 13

Я получил эту ошибку для приложения Windows при использовании Microsoft.Office.Interop.Excel;... версии исполнения не кажутся совместимыми между одной или несколькими DLL.

МОЕ РЕШЕНИЕ: Я преобразовал все мое решение из .NET 4.0 в .NET 3.5

черт возьми, я преобразовал его обратно в 4.0, и я снова начал получать ошибку.

на основе этого для вашей ошибки попробуйте преобразовать ваше решение в более раннюю платформу .NET, которая может работать.

========== РЕДАКТИРОВАНИЕ =================

Через 2 часа я заканчиваю некоторые ключевые вещи в классе Excell interop, и это работает как шарм... по какой-то причине только на .NET 3.5, а не на 4.0 мое решение действительно в этом отношении

Ответ 15

У меня было что-то очень похожее на меня, хотя в моем случае я обновил ряд вещей, в том числе от Visual Studio 2010 до Visual Studio 2012. Я следовал всем вышеперечисленным предложениям и все еще страдал. В итоге я решил воссоздать весь проект. Только когда я попытался повторно добавить аспекты членства в моем файле web.config, это внезапно стало очевидным, когда столкновение с версиями было для меня.

<sessionState mode="InProc" customProvider="DefaultSessionProvider">
  <providers>
    <clear/>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/AppName"/>
  </providers>
</sessionState>

Хотя смотреть на это сейчас, это очевидно. Тип для обеспечения имеет конкретную версию. Я просто удалил версию и соответствующий тип найден. Поэтому в моем случае было принято решение заменить выше:

<sessionState mode="InProc" customProvider="DefaultSessionProvider">
  <providers>
    <clear/>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers" connectionStringName="DefaultConnection" applicationName="/AppName"/>
  </providers>
</sessionState>

И затем перекомпилируйте. Мне потребовались дни, чтобы найти это, поскольку я искал во всех неправильных местах!

Ответ 16

Я пробовал все другие предложения в этом файле, и никто не работал над моим существующим решением MVC 4. Поэтому после обновления моего VS2012 до WebTools 2013.1 для VS 2012 я создал новый проект MVC 5 и использовал новые файлы проекта в качестве базы, удалил все посторонние строки из всех моих файлов web.config.

После этого все мои ошибки компиляции и предупреждения исчезли, и Intellisense начал работать правильно. Полностью удаляя < system.web > <pages> раздел в основном файле web.config, наконец, исправил ошибки динамического выражения ViewBag.Title(и других).

Ответ 17

Как я недавно узнал, некоторые расширения также могут вызвать это. В моем случае удаление расширения AutoHistory 1.0.1 исправило его для меня (MVC5).

Ответ 18

Одной из распространенных причин этой проблемы является то, что вы пропустили обновление версии сборки в вашем файле Views/web.config. Мне довольно легко пропустить их в <system.web><pages>, например:

<pages
    validateRequest="false"
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">

Ответ 19

Я тоже борюсь с этой проблемой в течение дня или около того. После того, как я наконец нашел эту статью здесь и попробовал все предложения здесь, я пришел к другому решению, которое решило проблему для меня:

Это как раз наоборот, как нашел Арман Биматов:

1) Перейдите к ссылкам проекта

2) Щелкните правой кнопкой мыши на Microsoft.CSharp → Свойства

3) Измените Копировать Локальный на Истинный, если у вас есть значение False.

Я думаю, что он должен иметь дело с сборками, зарегистрированными в GAC, и тем, как Visual Studio получает "правильную" версию. Я полагаю, что на моей машине-разработчике .NET Framework 3.5 была установлена ​​после новых Framework (если это вообще возможно), поэтому Visual Studio получает неверную версию от GAC. Или просто неясно, VS для того, чтобы получить, какая версия, поэтому она берет более старую...

Если у вас все еще есть одно сообщение об ошибке, вы также можете попробовать установить Копировать локальное в True для System.Core Dll и посмотреть, как он работает сейчас.

Отношения SkippingAdi

Ответ 20

Я боролся с этой проблемой в течение нескольких дней и, наконец, понял это.

Все, что я сделал, это удалить из web.config следующее:

<dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31BF3856AD364E35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Razor" publicKeyToken="31BF3856AD364E35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>

Ответ 21

Я начинаю получать ту же ошибку после установки пакета MVCSiteMapProvider, чтобы сделать сухарики для моего сайта.

Если вы установили MVCSiteMapProvider и получите эту ошибку, вам нужно заменить @ViewBag.Title на что-то еще, например, @Html.MvcSiteMap().SiteMapTitle()