.net - 如何使用 Mono.Cecil 更改类型的访问器

标签 .net command-line-interface mono.cecil class-visibility

这可能吗?

我想将公共(public)类(class)设为内部。

谢谢

最佳答案

可能吗?当然!它可以很简单:

1)加载程序集;

2)查找类型;

3)更改其可见性;

4)保存程序集

但是,您最终可能会得到一个非常损坏的组件。例如。如果类型 T 现在是内部类型,但在公共(public)字段、属性、方法中使用...那么 peverify 不会喜欢它。

对于(开源)Moonlight在项目中,我们使用了一个基于 Cecil 的调谐器,它删除并(在您的情况下)内化很多东西,以便 Mono BCL(匹配 MS 完整框架)看起来像 Silverlight BCL。

我想您应该从下面的链接阅读(MIT.X11 许可的)源代码,以获得内部化类型的完全工作实现。

https://github.com/mono/mono/tree/master/mcs/tools/tuner

https://github.com/mono/moon/tree/master/class/tuning

编辑模式详细信息(复制/粘贴/改编)来自MoonlightA11yProcessor.cs

    void MakeApiInternal ()
    {
        foreach (TypeDefinition type in _assembly.MainModule.Types) {
            if (type.IsPublic)
                type.IsPublic = false;

            if (type.HasMethods)
                foreach (MethodDefinition method in type.Methods.Where (m => !m.IsConstructor))
                    if (method.IsPublic)
                        method.IsAssembly = true;
        }
    }

这将使(已加载的)_assemble 中的每个 public 类型成为 internal 类型(包括所有非构造函数方法)。您只需过滤您自己的类型(例如,基于其FullName 属性)并将其保存回来。

关于.net - 如何使用 Mono.Cecil 更改类型的访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7878318/

相关文章:

c# - C# 中具有可变内容的字符串插值

c# - 反转数组中没有第一个的所有单词

.net - 将参数传递给 SQLCommand 的最佳方法是什么?

php - 通过 -z 参数加载 xdebug

c# - 如何限制 PDB 文件中的 0xFEEFEE 行数

c# - 如何在不更改编码的情况下替换 XElement 值

linux - 获取最新的文件名,其中扩展名区分大小写

php - 如何为 PHP CLI 启用颜色?

mono.cecil - 无法使用 Mono.Cecil 找到 AssemblyFactory 类

c# - 通过 C# 代码解析/重构 C#