Как изменить аксессор типа с помощью Mono.Cecil - PullRequest
2 голосов
/ 24 октября 2011

Возможно ли это?

Я хочу сделать публичный класс внутренним.

Спасибо

1 Ответ

5 голосов
/ 25 октября 2011

Возможно?Конечно!Это может быть просто:

1) загрузить сборку;

2) найти тип;

3) изменить его видимость;

4) сохранить сборку

Однако вы можете получить очень сломанную сборку.Например, если тип T теперь является внутренним, но используется в открытых полях, свойствах, методах ... тогда peverify не понравится.

Для (с открытым исходным кодом) *В проекте 1016 * 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) и сохранить его обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...