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

Mac下使用assembly.GetType()无法访问内部类的技术问题

ASP.NET Framework应用在Mono下反射RemotingConfigHandler失败的解决方案

问题核心

你的ASP.NET Framework应用在Windows上运行正常,但在Mac通过Visual Studio for Mac + Mono环境用xsp运行时,以下反射代码会抛出NullReferenceException,调试发现type变量为null:

Assembly assembly = Assembly.GetAssembly(typeof(RemotingConfiguration));
Type type = assembly.GetType("System.Runtime.Remoting.RemotingConfigHandler");
FieldInfo field = type.GetField("_errorMode", BindingFlags.Static | BindingFlags.NonPublic);

遍历该程序集所有类型后,也未找到System.Runtime.Remoting.RemotingConfigHandler类。

原因分析

这是Mono与官方.NET Framework的实现差异导致的:

  • RemotingConfigHandler是.NET Framework的内部私有类,不属于公开API范畴,Mono的Remoting实现并没有严格复刻这个类的结构与命名。
  • Mono对传统ASP.NET Framework的Remoting支持存在兼容性缺口,部分内部实现细节与官方框架不一致。

解决方法

1. 抛弃对内部类的依赖(优先推荐)

依赖框架内部类的代码本身就存在兼容性风险,不同运行时、不同版本的框架都可能导致代码失效。你需要重新梳理需求:

  • 如果是要修改Remoting的错误处理模式,查找Mono官方文档中对应的公开配置API,比如通过配置文件修改Remoting参数,或者使用Mono提供的替代公开接口。

2. 检查Mono的Remoting程序集结构

使用Mono自带的monodis工具,查看System.Runtime.Remoting.dll中的类型定义,确认是否存在功能等效的类:

monodis --types /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.5/System.Runtime.Remoting.dll

根据输出结果,调整反射目标的类名或命名空间,适配Mono的实现。

3. 条件编译适配多环境

如果必须保留反射逻辑,可以通过条件编译区分Windows和Mono环境,分别实现适配代码:

#if NETFRAMEWORK
// Windows .NET Framework 下的原逻辑
Assembly assembly = Assembly.GetAssembly(typeof(RemotingConfiguration));
Type type = assembly.GetType("System.Runtime.Remoting.RemotingConfigHandler");
FieldInfo field = type.GetField("_errorMode", BindingFlags.Static | BindingFlags.NonPublic);
#elif MONO
// Mono 下的适配逻辑,根据monodis的结果替换为对应类型
Assembly assembly = Assembly.GetAssembly(typeof(RemotingConfiguration));
Type type = assembly.GetType("Mono.Runtime.Remoting.RemotingConfigHandler"); // 示例,以实际输出为准
if (type != null)
{
    FieldInfo field = type.GetField("_errorMode", BindingFlags.Static | BindingFlags.NonPublic);
    // 后续逻辑
}
#endif

注意需要在Visual Studio for Mac的项目属性中添加MONO编译符号。

4. 升级Mono或迁移到.NET跨平台运行时

  • 尝试升级到最新稳定版的Mono,新版本可能修复了更多Remoting兼容性问题。
  • 长期来看,建议将应用迁移到.NET 5+(当前的.NET跨平台框架),Mono对传统ASP.NET Framework的支持正在逐步弱化,而.NET跨平台版本的Remoting替代方案(如gRPC、WCF Core)更稳定且跨平台兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:09:31