C#跨解决方案复制方法报错:无法访问PropertySet的internal索引器
问题成因确认
完全由PropertySet类上的internal索引器访问限制导致,和你排查的缺失依赖、框架引用问题没有关联。
C#中internal修饰的类成员,默认仅允许被同一程序集(编译生成的同一个dll/exe)内部的代码访问,跨程序集调用会直接被编译器拦截。
对应你的场景:
- 解决方案A中能正常运行,是因为调用索引器的代码和
PropertySet类的定义属于同一个编译输出程序集,同程序集内访问internal成员不受限制 - 复制代码到解决方案B后,你的测试代码是编译在解决方案B自己的程序集里的,引用的是
PropertySet所属的独立外部程序集dll,跨程序集访问internal索引器时,就会触发你看到的两个报错:编译器找不到公开可访问的索引器入口,同时识别出你在越界尝试访问internal的私有访问入口
可行的变通方案
根据你对PropertySet类的修改权限,可选择对应方案:
- 调整索引器的访问级别:将原定义
internal JToken this[string key] {get; set;}中的internal改为public,重新编译PropertySet所在的程序集,替换解决方案B中引用的dll即可。该方案改动最小,能快速打通跨程序集的访问权限。 - 配置友元程序集放行:如果不希望将索引器设为公开(避免破坏原有类的封装边界),可以在
PropertySet所在程序集的项目中,添加程序集级别的特性[assembly: InternalsVisibleTo("解决方案B的项目程序集名称")],将解决方案B的程序集标记为可信友元,允许其访问原程序集的所有internal成员,重新编译原程序集并替换引用后即可解除访问限制。 - 替换非法的索引器调用逻辑:如果无法修改
PropertySet类的源码、也无法重新编译对应dll,就不要直接用ps["id"]这类跨程序集的internal访问方式,改为调用类上已有的公开属性获取方法(比如类中公开的GetProperty(string key)方法)拿到属性值,再执行后续的序列化、断言对比逻辑即可。
内容的提问来源于stack exchange,提问作者user15274463
相关产品推荐
相关产品推荐

