【问题标题】:Hiding types from being listed in Assembly.GetTypes in .net隐藏类型以防止在 .net 中的 Assembly.GetTypes 中列出
【发布时间】:2011-12-19 23:36:36
【问题描述】:

我一直在到处寻找可能的解决方案,但似乎找不到答案。我的问题是我有一些类需要从 Assembly.getTypes 中完全隐藏,因为我正在为应用程序编写插件,并且它正在获取我需要保持隐藏的类型(即使它们被声明为也会发生这种情况私有或内部类)。

任何人都知道如何更改 assembly.GetTyes 返回的内容,或者更改将阻止这些类型列出的爱好者属性吗?

【问题讨论】:

  • 你不能从反射中隐藏东西,它不是一种安全机制。
  • @BenRobinson:你不能从反射中隐藏东西,因为它是一种安全机制。类型元数据用于堆栈遍历和权限测试。
  • 对不起,我把它说回了前面,我的意思是像受保护和内部这样的保护级别不是安全机制。

标签: c# reflection assemblies hidden


【解决方案1】:

这是一个相当黑客并且非常脆弱,但可以工作。

创建 2 个程序集——一个用于插件,第二个用于其他类型。第二个将被放置在另一个 known 目录中,并在需要时动态加载到第一个目录中。 (例如,通过Assembly.LoadFrom。)

然后,第一个程序集将被放置在插件目录中,并且只发布其类型。这非常脆弱,因为您可能必须对第二个程序集的路径进行硬编码,并且您冒着文件被删除或移动的风险。

编辑
@SLaks 的评论消除了该解决方案的脆弱性。如果您将第二个程序集作为资源嵌入并在运行时加载它,调用 Assembly.GetTypes 的应用程序将看不到您想要隐藏的类型。

【讨论】:

  • 您可以从嵌入式资源加载第二个程序集。
  • 啊……没想到。好主意!
  • 好主意!幸运的是,我的目录不是问题,因为应用程序公开了我可以访问的目录,但资源的想法是天才。
  • 嗯...这有点小麻烦-看起来可能需要其中一些类型才能有机会加载程序集(即:在反序列化期间)。任何人都知道一种挂钩类库的“onLoad”的方法,如果这有意义吗?我似乎也找不到这样做的方法。
  • @JeremyTang:在代码运行之前处理AppDomain.AssemblyResolve
【解决方案2】:

这是不可能的。
对不起。

调用Assembly.GetTypes() 的代码通常应该只过滤public 类型。

【讨论】:

    【解决方案3】:

    欢迎使用托管代码。 .NET 的类型验证器需要完整的类型信息。只有原生代码才能从 .NET 元数据中隐藏,然后你就放弃了纯 MSIL 支持的可移植性和权限。

    【讨论】:

      猜你喜欢
      • 2014-04-13
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2023-03-05
      • 1970-01-01
      • 2011-12-14
      相关资源
      最近更新 更多