通过与公共成员一起修改后的程序集进行访问来访问私有成员的反射的替代方法

时间:2018-08-11 02:10:30

标签: c# reflection private access-modifiers unsafe

摘要

我搜索了一种通过反射访问私有成员的替代方法,看来我找到了一个。
剩下的问题是:

  1. 无论环境如何,它都能正常工作吗?
  2. 有没有不使用它的理由吗?

寻找替代品的原因

在程序设计工作和计算资源方面,使用反射或一些简化反射的工具以开销为代价。特别是如果您需要使用私有类型的实例,它将变得非常麻烦。
另外,您失去了代码完成的优势和IDE的其他功能。甚至简单的错字也可能导致错误,因为您使用字符串进行反射。

替代方法

采用原始程序集并将私人/非公共成员更改为公共成员(通过IL编辑器,反编译器或Cecil)。
将此修改后的程序集添加到您的引用中,然后就可以轻松进行开发,因为编译器认为您可以访问它们(对于此版本,您可以访问)。
但是,如果将编译后的程序集与原始程序集结合使用,则这仅适用于类型,因为如果访问其他私有成员,则在运行时会遇到访问冲突异常。
(如果启用了“允许不安全的代码” ),则似乎不再在乎访问修饰符。
我没有找到有关此功能的任何信息(?),但是此选项和代码中相关的不安全关键字通常主要用于指针。

对我来说,它起作用了,但是我不知道在其他情况下(例如,不同的操作系统和CLR版本)这种行为是否一致。
另外,如果还有其他原因为什么不使用此技术。

装配体宣传器

我编写了一个工具来创建一个程序集副本,其中所有成员都是公共的(类型,方法,字段,属性的getter和setter)。

https://github.com/CabbageCrow/AssemblyPublicizer

使用简单,在Windows上甚至可以将程序集拖放到exe上。

潜在的工作流程

  1. 使用该工具公开原始程序集
  2. 使用公开的程序集作为参考
  3. 轻松发展以接触私有成员并对此感到高兴
  4. 启用“允许不安全代码”的编译
    参见https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/unsafe-compiler-option
  5. 将您自己的程序集与未经修改的原始程序集一起使用,仍然可以神奇地访问私有成员。

0 个答案:

没有答案