Подтвердить что ты не робот

Страница Razor не может видеть ссылочную библиотеку классов во время выполнения в ASP.NET Core RC2

Я начал новый проект веб-приложения MVC для выпуска RC2, и я пытаюсь добавить библиотеку классов в качестве ссылки на проект.

Я добавил простую библиотеку классов в свой проект и ссылался на нее и получил следующее в файле project.json:

"frameworks": {
  "net452": {
    "dependencies": {
      "MyClassLibrary": {
        "target": "project"
      }
    }
  }
},

Я могу использовать эту библиотеку в любом из контроллеров и файлов Startup.cs без каких-либо проблем, но при запуске я получаю следующую ошибку при попытке использовать библиотеку со страницы Razor:

Имя "MyClassLibrary" не существует в текущем контексте Output.WriteLine(MyClassLibrary.MyStaticClass.SomeStaticString);

Это странно, потому что я получаю intellisense для библиотеки классов, когда редактирую страницу Razor, и я не могу найти ничего, что говорит, что вы не можете использовать ссылки на проект здесь.

Я думал, что это было достаточно сложно, чтобы запустить этот проект под RC1 с помощью "папки переноса" в проекте библиотеки классов, но это меня озадачило.

4b9b3361

Ответ 1

Обходной путь был опубликован на странице проблемы (cred to pranavkm и patrikwlund) https://github.com/aspnet/Razor/issues/755

Очевидно, вам нужно явно добавлять ссылки на компиляцию Razor с помощью RazorViewEngineOptions.CompilationCallback.

Добавьте в свой метод ConfigureServices следующее:

var myAssemblies = AppDomain.CurrentDomain.GetAssemblies().Select(x => MetadataReference.CreateFromFile(x.Location)).ToList();

services.Configure((RazorViewEngineOptions options) =>
{
    var previous = options.CompilationCallback;
    options.CompilationCallback = (context) =>
    {
        previous?.Invoke(context);

        context.Compilation = context.Compilation.AddReferences(myAssemblies);
    };
});

Ответ 2

Мне пришлось отфильтровывать динамические сборки, чтобы избежать этого исключения во время выполнения: Вызываемый элемент не поддерживается в динамической сборке.

Это сработало для меня:

var myAssemblies = AppDomain.CurrentDomain.GetAssemblies()
    .Where(x => !x.IsDynamic)
    .Select(x => Microsoft.CodeAnalysis.MetadataReference.CreateFromFile(x.Location))
    .ToList();
services.Configure((Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions options) => {
     var previous = options.CompilationCallback;
     options.CompilationCallback = (context) => {
         previous?.Invoke(context);
         context.Compilation = context.Compilation.AddReferences(myAssemblies);
     };
});