【问题标题】:Razor page can't see referenced class library at run time in ASP.NET Core RC2Razor 页面在 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 设置该标志对我有用。

标签: razor asp.net-core asp.net-core-mvc


【解决方案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);
     };
});

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 2020-12-12
    • 2019-12-27
    • 2022-01-20
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2019-05-22
    相关资源
    最近更新 更多