Razor 剃刀页面可以';在ASP.NET核心RC2中,在运行时看不到引用的类库

Razor 剃刀页面可以';在ASP.NET核心RC2中,在运行时看不到引用的类库,razor,asp.net-core,asp.net-core-mvc,Razor,Asp.net Core,Asp.net Core Mvc,我为RC2版本启动了一个新的MVCWeb应用程序项目,并尝试添加一个类库作为项目参考 我在我的项目中添加了一个简单的类库,并引用了它,在project.json文件中得到了以下内容: "frameworks": { "net452": { "dependencies": { "MyClassLibrary": { "target": "project" } } } }, 我可以在任何控制器和Startup.cs文件中使用此库,但在

我为RC2版本启动了一个新的MVCWeb应用程序项目,并尝试添加一个类库作为项目参考

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

"frameworks": {
  "net452": {
    "dependencies": {
      "MyClassLibrary": {
        "target": "project"
      }
    }
  }
},
我可以在任何控制器和Startup.cs文件中使用此库,但在运行时,当我尝试从Razor页面使用此库时,会出现以下错误:

当前上下文中不存在名称“MyClassLibrary” WriteLine(MyClassLibrary.MyStaticClass.SomeStaticString)

这很奇怪,因为当我编辑Razor页面时,我得到了类库的intellisense,但我找不到任何东西表明你不能从这里使用项目引用


我认为在类库项目中的“包装文件夹”下运行RC1已经够难了,但这让我很难堪。

问题页面上已经发布了一个解决方案(pranavkm和patrikwlund的认证)

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

将以下内容添加到启动类中的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);
    };
});

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

这对我很有用:

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);
     };
});

您是否设置了PreserveCompirationContext标志?ie为了解决这个问题,我将所需的功能包装在web项目中的一个类中,视图可以毫无问题地引用该类。我屏住呼吸等待这个问题的实际答案/解决方案。这里跟踪了这个问题:@N.TaylorMullen Yep,在我创建新项目时,默认情况下这是打开的。@N.TaylorMullen设置该标志对我有效。免责声明:GetAssembly()不保证完整列表,因为它只返回已加载的程序集。所以,测试它以确保它正确解析所有引用。这很有效!在调用getAssemblys()之前,我必须从类库显式创建一个对象,以确保它首先在列表中。@Matt如果您想明确包含哪些csproj程序集,可以使用以下代码段一次解析一个:
typeof(MyStaticClass).Assembly
。您也不必预加载assembly.net core不再包含AppDomain类