2

これは可能ですか?

パブリッククラスを内部にしたい。

ありがとう

4

1 に答える 1

5

可能 ?もちろん!次のように簡単にできます。

1) アセンブリをロードします。

2) タイプを見つけます。

3) 可視性を変更します。

4) アセンブリを保存します

ただし、非常に壊れたアセンブリになる可能性があります。たとえば、タイプTが現在内部であるが、パブリックフィールド、プロパティ、メソッドで使用されている場合... peverifyはそれを好まないでしょう。

(オープン ソースの) Moonlightプロジェクトでは、Mono BCL (MS フル フレームワークに一致) が Silverlight BCL のように見えるように、多くのものを削除して (あなたの場合は)内部化した Cecil ベースのチューナーを使用しました。

以下のリンクから (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;
        }
    }

これにより、(すでにロードされている)すべてのパブリック型が型になりますすべての非コンストラクターメソッドを含む)。独自のタイプをフィルタリングして(たとえば、そのプロパティに基づいて)、保存するだけです。_assemblyinternalFullName

于 2011-10-25T19:36:04.017 に答える