Страница 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 с помощью "папки переноса" в проекте библиотеки классов, но это меня озадачило.
Ответы
Ответ 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);
};
});