ASP.NET Core 7 Razor运行时编译无法访问internal类,添加InternalsVisibleTo无效
解决ASP.NET Core 7 Razor运行时编译访问internal类的问题
你的问题出在ASP.NET Core 7对Razor运行时编译的程序集生成机制做了调整——原来的InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation")不再生效,因为Razor编译时会生成独立的动态程序集,而非直接使用RuntimeCompilation的程序集来访问你的内部类型。以下是不用把internal改成public的解决办法:
方法1:允许所有视图动态程序集访问内部类型
Razor运行时编译生成的程序集通常以你的项目名.Views为前缀,所以可以直接添加通配符规则:
[assembly: InternalsVisibleTo("*.Views")]
如果是Debug环境下临时测试,也可以用更宽松的规则(不建议生产环境使用):
[assembly: InternalsVisibleTo("*")]
方法2:指定动态程序集名称并精准授权
在Program.cs中配置Razor运行时编译时,显式指定生成的程序集名称:
builder.Services.AddRazorPages() .AddRazorRuntimeCompilation(options => { // 自定义动态程序集名称 options.GeneratedAssemblyName = "MyApp.Views.Generated"; });
然后在项目的AssemblyInfo.cs(或任意类的顶部)添加对应的授权:
[assembly: InternalsVisibleTo("MyApp.Views.Generated")]
方法3:确认Debug模式的编译配置正确性
检查你的MyApp.csproj,确保RuntimeCompilation仅在Debug环境启用(避免影响生产):
<PropertyGroup Condition="'$(Configuration)' == 'Debug'"> <EnableRazorRuntimeCompilation>true</EnableRazorRuntimeCompilation> <RazorCompileOnBuild>false</RazorCompileOnBuild> <RazorCompileOnPublish>false</RazorCompileOnPublish> </PropertyGroup>
补充说明
ASP.NET Core 6及更早版本中,Razor运行时编译的程序集与主程序集的关联方式不同,所以旧的InternalsVisibleTo配置能生效,但ASP.NET Core 7重构了这部分逻辑,必须针对动态生成的视图程序集授权才能访问内部类型。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

