VS2022中C#类库Internal类仅对MVC项目可见的Razor访问问题
解决MVC5中Internal类在Razor视图无法访问的问题
问题原因
MVC5默认会将Razor视图(.cshtml)动态编译到随机命名的临时程序集,而非主Web项目程序集,导致你添加的[assembly:InternalsVisibleTo("Myapplication.Web")]对这些临时程序集无效,从而触发访问权限错误。
解决方案
方案1:强制Razor视图编译到主Web程序集
通过修改项目配置,让.cshtml文件在编译时直接合并到主Web程序集,这样原有的InternalsVisibleTo配置就能生效:
- 打开Web项目的
.csproj文件,在<PropertyGroup>节点中添加以下配置:
<MvcBuildViews>true</MvcBuildViews> <CompileViewsIntoAssembly>true</CompileViewsIntoAssembly>
- 保存后重新生成解决方案,此时Razor视图会编译到
Myapplication.Web程序集,即可正常访问类库中的Internal类。
方案2:封装Internal类为公共辅助类(推荐)
如果不想修改编译配置,可以在Web项目中编写一个公共的辅助类,封装Internal类的访问逻辑,仅暴露Razor视图需要的属性:
- 在Web项目中创建一个公共类,例如
WebSessionHelper:
public static class WebSessionHelper { // 假设类库中获取会话信息的方法是SessionManager.GetSessionInfo() public static string CurrentUserId => SessionManager.GetSessionInfo().UserId; public static string CurrentUsername => SessionManager.GetSessionInfo().Username; }
- 在Razor视图中直接调用这个公共类的属性:
@WebSessionHelper.CurrentUserId
这种方式更符合封装原则,避免直接在视图中暴露内部类的细节。
方案3:允许临时Razor程序集访问(不推荐)
如果以上两种方案都不适用,可以通过InternalsVisibleTo允许所有无签名程序集访问内部类,但存在安全风险,仅建议在内部测试环境使用:
在类库项目的AssemblyInfo.cs中添加:
[assembly: InternalsVisibleTo("*")]
补充说明
InternalsVisibleTo是基于程序集生效的,无法直接针对特定csproj配置,因为csproj最终编译为程序集,本质还是程序级别的授权。- 方案1的编译配置会增加项目编译时间,但能彻底解决视图访问内部类的问题;方案2更安全灵活,是生产环境的推荐做法。
内容的提问来源于stack exchange,提问作者LarryBud
相关产品推荐
相关产品推荐

