Не удалось найти имя типа или пространства имен в ASP.NET Core 1.0 RC2.

В настоящее время я пытаюсь использовать ASP.NET Core 1.0 RC2. Я создал его как проект .NET Framework (в отличие от проекта .NET Core) и добавил ссылки на нашу библиотеку Models, используя .NET Framework 4.5, через ссылку на проект:

"frameworks": {
  "net46": {
    "dependencies": {
      "Project.Core": {
        "target": "project"
      },
      "Project.DataAccess": {
        "target": "project"
      },
      "Project.Encryption": {
        "target": "project"
      },
      "Project.Models": {
        "target": "project"
      },
      "Project.Resources": {
        "target": "project"
      }
    }
  }
},

Теперь при добавлении директивы модели в мое представление возникает следующая ошибка:

@model System.Collections.Generic.List<Project.Models.User>

The type or namespace name 'Project' could not be found (are you missing a using directive or an assembly reference?)
    public class _Views_Home_Index_cshtml : Microsoft.AspNetCore.Mvc.Razor.RazorPage<System.Collections.Generic.List<Project.Models.User>>
The type or namespace name 'Project' could not be found (are you missing a using directive or an assembly reference?)
        public Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper<System.Collections.Generic.List<Project.Models.User>> Html { get; private set; }

Он также отображается в intellisense: Не удается разрешить тег "Project.Models.User" и Не удается разрешить символ "модель"

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


person SeToY    schedule 02.06.2016    source источник


Ответы (4)


Это ошибка в RC2 с открытой проблемой. обходной путь в обсуждении проблемы, который мне подходит:

services.AddMvc()
.AddRazorOptions(options =>
{
    var previous = options.CompilationCallback;
    options.CompilationCallback = context =>
    {
        previous?.Invoke(context);
        context.Compilation = context.Compilation.AddReferences(MetadataReference.CreateFromFile(typeof(MyClass).Assembly.Location));
    };
    });

В вашем примере вам нужно сделать это для Project.Models.User.

Не уверен, нужны ли 4.6.1 и Update 2 для обоих проектов, я пробовал только это.

person bzlm    schedule 18.06.2016
comment
Эта ошибка по-прежнему присутствует в ASP.NET Core 1.1 в Visual Studio 2017. - person gimlichael; 05.02.2017
comment
Из комментариев на github.com/aspnet/Mvc/issues/4686 и github.com/aspnet/Razor/issues/755 похоже, что люди успешно решили эту проблему. Что если попробовать описанные там методы? @Майкл Мортенсен - person bzlm; 06.02.2017
comment
Я решил это, используя ваш ответ, и отправил сообщение об ошибке в Microsoft. Я использую VS2017. - person gimlichael; 06.02.2017

Проект библиотеки классов должен быть создан в Visual Studio 2015 с обновлением 2 и должен использовать .NET Framework 4.6.1. И ваш проект ASP.NET Core также должен использовать .NET Framework 4.6.1.

RC2 — первая версия, которая предположительно поддерживает включение библиотек классов. Но я обнаружил, что если ваша библиотека классов имеет определенные зависимости (например, System.DirectoryServices.AccountManagement), она не сможет загрузиться во время выполнения.

person Clint B    schedule 02.06.2016
comment
Есть ли реальная разница при создании проекта библиотеки (который был создан VS 2010 или около того несколько лет назад), когда он использует .NET Framework 4.6.1? - person SeToY; 02.06.2016
comment
Да, большая разница. Это то, с чем, по-видимому, борются разработчики Microsoft. Я подтвердил, что это работает только тогда, когда оба проекта были созданы в VS 2015 Update 2 и оба используют 4.6.1. Помните, что это предварительная версия, и все может измениться. Но пока это так. - person Clint B; 02.06.2016
comment
Клинт – Я рад, что ты решил продолжать вносить свой вклад. Я проголосовал за этот ответ. - person RonC; 02.06.2016
comment
Спасибо, я попробую это, как только приду домой и проголосую соответственно. Однако: в чем разница между файлами проекта при создании с разными версиями VS? Потому что тогда мне нужно будет только изменить файлы проекта, чтобы он заработал, вместо того, чтобы заново создавать весь проект. И о пре-релизе: Ну, это может быть пре-релиз, но он лицензирован для запуска :p - person SeToY; 02.06.2016
comment
Я бы даже не стал выяснять все детали различий между VS Update 1 и Update 2. ASP.NET Core и .NET Core — это скачок поколений. Это не похоже ни на одно из обновлений .NET Framework за последние шесть лет. Это совершенно новый стек, полностью несовместимый с более ранними версиями. И RC2 далеко не готов к запуску. RC2 — это скорее бета-версия, поскольку это первая версия, в которой используется новый интерфейс командной строки .NET Core. Это одно из больших различий между VS Update 1 и Update 2. - person Clint B; 02.06.2016
comment
Спасибо за объяснение. Интересно, почему Microsoft тогда сообщает об этом как о готовом к выпуску выпуске... Заставляет меня задаться вопросом, должен ли я действительно начинать свой новый проект с RC2. - person SeToY; 02.06.2016
comment
Последние шесть месяцев я работал над новым проектом с использованием ASP.NET 5/Core и смог найти обходной путь для всех своих проблем. Включая эту проблему с dll. Вместо использования проекта библиотеки классов я создаю проект веб-приложения ASP.NET Core и удаляю все, кроме project.json. Затем добавьте в этот проект весь мой общий код, модели и промежуточное ПО. Я мог бы продолжать и продолжать обо всех обходных путях, которые мне пришлось выяснить. Но дело в том, что это возможно, если вы готовы пойти на некоторые краткосрочные жертвы, зная, что позже все придется переделывать. - person Clint B; 02.06.2016
comment
Я сейчас пришел, чтобы проверить это. Я изменил проект для сборки на .NET FX 4.6.1, и метаданные файла проекта выглядят точно так же, как и созданные с помощью VS 2015 Update 2. Однако ошибка все еще сохраняется. (Примечание: это все еще библиотека классов, а не библиотека классов .NET Core) - person SeToY; 03.06.2016
comment
Обновление: я также создал новый проект ASP.NET Core Framework и новую библиотеку классов, но безрезультатно. Не работает. The type or namespace name 'ClassLibrary1' could not be found (are you missing a using directive or an assembly reference?) public class _Views_Home_About_cshtml : Microsoft.AspNetCore.Mvc.Razor.RazorPage<IEnumerable<ClassLibrary1.Class1>> - person SeToY; 03.06.2016

Я исправил это, изучив файл _ViewImports.cshtml. Вот куда идут все использования, которые загружаются во все представления.

Например -

@using MyProject
@using MyProject.Models
@using MyProject.Models.AccountViewModels
@using MyProject.Models.ManageViewModels
@using Microsoft.AspNetCore.Identity
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
person Mike Jones    schedule 18.01.2017

Убедившись, что saveCompilationContext присутствует и является истинным в buildOptions project.json, устранила эту проблему для меня с кодом Visual Studio в Ubuntu.

{
    "buildOptions": {
        "emitEntryPoint": true,
        "warningsAsErrors": true,
        "preserveCompilationContext": true
    },
person onemorecupofcoffee    schedule 21.02.2017