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

Posted

技术标签:

【中文标题】Razor 页面在 ASP.NET Core RC2 运行时看不到引用的类库【英文标题】:Razor page can't see referenced class library at run time in ASP.NET Core RC2 【发布时间】:2016-05-18 02:51:57 【问题描述】:

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

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

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

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

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

这很奇怪,因为我在编辑 Razor 页面时获得了类库的智能感知,但我找不到任何说您不能从这里使用项目引用的内容。

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

【问题讨论】:

您是否设置了 preserveCompilationContext 标志?即github.com/aspnet/Entropy/blob/… 为了解决这个问题,我将所需的功能封装在 Web 项目中的一个类中,视图可以毫无问题地引用它。我屏住呼吸等待这个问题的实际答案/修复。 问题在此处跟踪:github.com/aspnet/Razor/issues/755 @N.TaylorMullen 是的,当我创建新项目时,这是默认开启的。 @N.TaylorMullen 设置该标志对我有用。 【参考方案1】:

已在问题页面上发布了解决方法(信任 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);
    ;
);

【讨论】:

免责声明:GetAssemblies() 不保证完整列表,因为它只返回已加载的程序集。因此,对其进行测试以确保它正确解析您的所有引用。 这行得通!我必须在调用 GetAssemblies() 之前从 ClassLibrary 显式创建一个对象,以确保它首先在列表中。 @Matt 如果您想明确包含哪些 csproj 组件,您可以使用以下 sn-p 一次解决它们:typeof(MyStaticClass).Assembly。您也不必预先加载程序集。 net core 不再包含 AppDomain 类【参考方案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);
     ;
);

【讨论】:

以上是关于Razor 页面在 ASP.NET Core RC2 运行时看不到引用的类库的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core 上的 Razor 页面 - 添加了 Razor 页面但无法让页面显示

如何在 ASP.Net Core Razor 页面上重定向

ASP .NET Core Razor 页面中的授权

Asp.net core razor pages 加载部分页面

Asp.Net Core Razor 页面中的远程验证

ASP.NET Core Razor 页面与完整 MVC Core [关闭]