无法调用System.Security.Cryptography.X509Certificates.SubjectAlternativeNameBuilder的私有方法

后端开发 2026-07-12

SubjectAlternativeNameBuilder 不提供 添加 _Registered Id_ attribute 的方法,因此,我尝试使用反射来实现我的目标:

var assembly = typeof(SubjectAlternativeNameBuilder).Assembly;
var generalNameAsnType = assembly.GetType("System.Security.Cryptography.Asn1.GeneralNameAsn");
var generalNameAsn = Activator.CreateInstance(generalNameAsnType);
generalNameAsnType.GetField("RegisteredId", BindingFlags.Instance | BindingFlags.NonPublic)
    .SetValue(generalNameAsn, "1.3.6.1.4.1.311.20.2.3");
var methodInfo = typeof(SubjectAlternativeNameBuilder).GetMethod("AddGeneralName");
var san = new SubjectAlternativeNameBuilder();
methodInfo.Invoke(san, \[generalNameAsn\]);

但我在最后一行得到了 NullReferenceException。出于某种原因,我无法进入 methodInfo.Invoke 的调试。如果我尝试,我会看到以下内容

异常信息: 异常信息

如何使用反射调用这个方法?

解决方案

我能看到的第一个问题是:你在找的 AddGeneralName 方法不存在,或者它不是公有的。但你在把它当作公有来寻找,因为对于 System.Type.GetMethod 的默认访问是公开的。因此,它应该返回 null。 请参阅 https://learn.microsoft.com/en-us/dotnet/api/system.type.getmethod

这只是一个你可以很容易通过 System.Reflection.BindingFlags 解决的问题。也可能还有其他问题。

不过,请认真关注我的以及其他评论。我理解如果你只对反射技术感兴趣。通常,你会将反射应用到你自己的代码中。一个典型的用例是插件系统。

但包含该方法的代码并非你的代码。具体来说,这意味着你提到的方法并非设计为可调用的。因此,根据你的目的,你需要做别的事情,在不破坏该API的访问控制机制的前提下。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章