Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Razor page can't see referenced class library at run time in ASP.NET Core RC2

I started a new MVC Web Application project for the RC2 release and I'm trying to add a class library as a project reference.

I added a simple class library to my project and referenced it and got the following in the project.json file:

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

I can use this library in any of the Controllers and the Startup.cs files without any trouble but I get the following error at run time when I try and use the library from a Razor page:

The name 'MyClassLibrary' does not exist in the current context Output.WriteLine(MyClassLibrary.MyStaticClass.SomeStaticString);

It's weird because I'm getting intellisense for the class library when I'm editing the Razor page, and I can't find anything that says you can't use project references from here.

I thought it was hard enough getting this running under RC1 with the "wrap folder" in the class library project but this has me stumped.

like image 558
Matt Avatar asked May 18 '16 02:05

Matt


2 Answers

A workaround has been posted on the issue page (cred to pranavkm and patrikwlund) https://github.com/aspnet/Razor/issues/755

Apparently you need to explicitly add references to Razor compilation using RazorViewEngineOptions.CompilationCallback.

Add the following to your ConfigureServices method in your Startup class:

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);
    };
});
like image 107
Evil Pigeon Avatar answered Sep 20 '22 14:09

Evil Pigeon


I had to filter out dynamic assemblies to avoid this runtime exception: The invoked member is not supported in a dynamic assembly.

This worked for me:

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);
     };
});
like image 29
KTCO Avatar answered Sep 23 '22 14:09

KTCO