Почему я получаю сообщение «Не удается найти один или несколько типов, необходимых для компиляции динамического выражения»? - PullRequest
61 голосов
/ 19 августа 2011

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

  • .NET 3.5 MVC v2 до
  • .NET 4.0 MVC v3

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

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

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

  1. Выполнено шагов обновления
  2. Установите целевую платформу на вкладке Проект / Свойства / Приложение на .NET Framwework 4
  3. Добавлен System.Core framework вручную
  4. Добавлен Microsoft.CSharp framework
  5. Добавлен System.Xml framework
  6. Добавлен System.Xml.Linq framework
  7. Убедитесь, что мой Web.Config правильный (перезаписывается Web.Debug.Config и т. Д.)
  8. Создан модель , контроллер и Razor View
  9. Создать __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>
....

Ответы [ 21 ]

63 голосов
/ 18 ноября 2011

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

49 голосов
/ 22 августа 2011

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

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

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

34 голосов
/ 29 апреля 2012

В проект необходимо добавить ссылку на версию Microsoft.CSharp.dll - v4.0.30319.Который доступен в C: \ Program Files \ Справочные сборки \ Microsoft \ Framework \ .NETFramework \ v4.0 \ Microsoft.CSharp.dll, после установки VS 2010

12 голосов
/ 19 марта 2012

Для меня решение было добавить:

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

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

7 голосов
/ 19 августа 2011

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

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

6 голосов
/ 27 октября 2011

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

Сначала я заметил, что с помощью 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

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

Я надеюсь, что это поможет вам, Бест, Н.

5 голосов
/ 28 октября 2013

Это было мое разрешение:

1) Перейдите в Список проектов

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

3) ИзменитеСкопируйте Локально в Ложь, если оно у вас есть, Истина.

5 голосов
/ 06 марта 2015

Если вы видите это сообщение в ваших представлениях 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>

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

3 голосов
/ 07 марта 2013

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

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

2 голосов
/ 14 июля 2013

Woow!

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

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

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

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

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