Razor页面在ASP.NET Core RC2中无法在运行时看到引用的类库

Mat*_*att 17 razor asp.net-core-mvc asp.net-core

我为RC2版本启动了一个新的MVC Web应用程序项目,我正在尝试添加一个类库作为项目引用.

我在项目中添加了一个简单的类库并引用它,并在project.json文件中获得以下内容:

"frameworks": {
  "net452": {
    "dependencies": {
      "MyClassLibrary": {
        "target": "project"
      }
    }
  }
},
Run Code Online (Sandbox Code Playgroud)

我可以在任何控制器和Startup.cs文件中使用此库,没有任何问题,但是当我尝试使用Razor页面中的库时,我在运行时收到以下错误:

当前上下文中的名称'MyClassLibrary'不存在Output.WriteLine(MyClassLibrary.MyStaticClass.SomeStaticString);

这很奇怪,因为当我编辑Razor页面时,我正在为类库提供intellisense,而且我找不到任何说明你不能从这里使用项目引用的东西.

我认为在类库项目中使用"wrap文件夹"在RC1下运行很难,但这让我很难过.

Evi*_*eon 13

在问题页面上发布了一个解决方法(pranavkm和patrikwlund相信) https://github.com/aspnet/Razor/issues/755

显然,您需要使用RazorViewEngineOptions.CompilationCallback显式添加对Razor编译的引用.

将以下内容添加到Startup类中的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);
    };
});
Run Code Online (Sandbox Code Playgroud)


KTC*_*TCO 5

我不得不过滤掉动态程序集以避免此运行时异常: 动态程序集中不支持调用的成员.

这对我有用:

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);
     };
});
Run Code Online (Sandbox Code Playgroud)