You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2022中C#类库Internal类仅对MVC项目可见的Razor访问问题

解决MVC5中Internal类在Razor视图无法访问的问题

问题原因

MVC5默认会将Razor视图(.cshtml)动态编译到随机命名的临时程序集,而非主Web项目程序集,导致你添加的[assembly:InternalsVisibleTo("Myapplication.Web")]对这些临时程序集无效,从而触发访问权限错误。

解决方案

方案1:强制Razor视图编译到主Web程序集

通过修改项目配置,让.cshtml文件在编译时直接合并到主Web程序集,这样原有的InternalsVisibleTo配置就能生效:

  1. 打开Web项目的.csproj文件,在<PropertyGroup>节点中添加以下配置:
<MvcBuildViews>true</MvcBuildViews>
<CompileViewsIntoAssembly>true</CompileViewsIntoAssembly>
  1. 保存后重新生成解决方案,此时Razor视图会编译到Myapplication.Web程序集,即可正常访问类库中的Internal类。

方案2:封装Internal类为公共辅助类(推荐)

如果不想修改编译配置,可以在Web项目中编写一个公共的辅助类,封装Internal类的访问逻辑,仅暴露Razor视图需要的属性:

  1. 在Web项目中创建一个公共类,例如WebSessionHelper:
public static class WebSessionHelper
{
    // 假设类库中获取会话信息的方法是SessionManager.GetSessionInfo()
    public static string CurrentUserId => SessionManager.GetSessionInfo().UserId;
    public static string CurrentUsername => SessionManager.GetSessionInfo().Username;
}
  1. 在Razor视图中直接调用这个公共类的属性:
@WebSessionHelper.CurrentUserId

这种方式更符合封装原则,避免直接在视图中暴露内部类的细节。

方案3:允许临时Razor程序集访问(不推荐)

如果以上两种方案都不适用,可以通过InternalsVisibleTo允许所有无签名程序集访问内部类,但存在安全风险,仅建议在内部测试环境使用:
在类库项目的AssemblyInfo.cs中添加:

[assembly: InternalsVisibleTo("*")]

补充说明

  • InternalsVisibleTo是基于程序集生效的,无法直接针对特定csproj配置,因为csproj最终编译为程序集,本质还是程序级别的授权。
  • 方案1的编译配置会增加项目编译时间,但能彻底解决视图访问内部类的问题;方案2更安全灵活,是生产环境的推荐做法。

内容的提问来源于stack exchange,提问作者LarryBud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:00:18