如何使用Mono.Cecil更改类型的访问者

时间:2011-10-24 15:50:02

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

这可能吗?

我想在内部制作一个公共课。

由于

1 个答案:

答案 0 :(得分:5)

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

1)加载组件;

2)找到类型;

3)改变它的可见性;

4)保存程序集

但是你最终可能会遇到一个非常破碎的装配。例如。如果类型T现在是内部的,但在公共字段,属性,方法中使用...那么 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;
        }
    }

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