net - razor pages español
La página Razor no puede ver la biblioteca de clases a la que se hace referencia en tiempo de ejecución en ASP.NET Core RC2 (2)
Comencé un nuevo proyecto de aplicación web MVC para la versión RC2 y estoy tratando de agregar una biblioteca de clases como referencia del proyecto.
Agregué una biblioteca de clases simple a mi proyecto y la referenciaré y obtuve lo siguiente en el archivo project.json:
"frameworks": {
"net452": {
"dependencies": {
"MyClassLibrary": {
"target": "project"
}
}
}
},
Puedo usar esta biblioteca en cualquiera de los controladores y los archivos Startup.cs sin ningún problema, pero recibo el siguiente error en el tiempo de ejecución cuando intento usar la biblioteca desde una página de Razor:
El nombre ''MyClassLibrary'' no existe en el contexto actual Output.WriteLine (MyClassLibrary.MyStaticClass.SomeStaticString);
Es raro porque estoy obteniendo inteligencia para la biblioteca de la clase cuando edito la página de Razor, y no puedo encontrar nada que diga que no se pueden usar referencias de proyectos desde aquí.
Pensé que era bastante difícil hacer que esto funcionara bajo RC1 con la "carpeta de envoltura" en el proyecto de la biblioteca de clases, pero esto me ha dejado perplejo.
Se ha publicado una solución en la página del problema (cred to pranavkm and patrikwlund) github.com/aspnet/Razor/issues/755
Al parecer, necesitas agregar explícitamente referencias a la compilación de Razor usando RazorViewEngineOptions.CompilationCallback.
Agregue lo siguiente a su método ConfigureServices en su clase de inicio:
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);
};
});
Tuve que filtrar conjuntos dinámicos para evitar esta excepción de tiempo de ejecución: el miembro invocado no es compatible con un conjunto dinámico.
Esto funcionó para mí:
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);
};
});