2

这可能吗?

我想在内部创建一个公共课程。

谢谢

4

1 回答 1

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的EDIT模式详细信息(复制/粘贴/改编)

    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属性)并将其保存回来。

于 2011-10-25T19:36:04.017 回答