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 页面但无法让页面显示