Razor 剃刀页面可以';在ASP.NET核心RC2中,在运行时看不到引用的类库
我为RC2版本启动了一个新的MVCWeb应用程序项目,并尝试添加一个类库作为项目参考 我在我的项目中添加了一个简单的类库,并引用了它,在project.json文件中得到了以下内容: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文件中使用此库,但在
"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类