この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 50355|答える: 0

[出典] .NET/C# エミットは動的にアセンブリを生成します

[リンクをコピー]
2021年3月21日 12:38:34に投稿 | | | |
アプリケーションシナリオでは、私たちのC#コードによって動的にEXEを生成します。その応用シナリオは非常に多岐にわたり、ソフトウェア認証、認可情報の入力、認可されたDLLの生成などです。では、この機能を実現するには技術的なEmitについて触れなければなりません。

1. エミットの概要

エミットは、発出や発生と呼べます。 フレームワークでは、Emitに関連するクラスは基本的にSystem.Reflection.Emit名前空間の下に存在します。 エミットは反射の要素として存在することがわかります。 リフレクションについて言えば、誰もが慣れ親しんでいるはずです。これによりアセンブリの要素を閲覧できるため、アセンブリに含まれる型や型に含まれるメソッドなど多くの情報を得ることができます。 しかし、反射は「見える」のみであり、Emitは実行時に動的にコードを生成できます。 Emitでコードを生成する方法を見てみましょう。

2. アセンブリおよび管理モジュール

アセンブリは1つ以上のモジュール、リソースファイルの論理的なグループであり、次にアセンブリは再利用、セキュリティ、バージョン管理の最小単位です。 私たちが見るDLLやEXEはアセンブリと呼べます。アセンブリは複数のモジュールを含みますが、通常VSコンパイルでは1つのモジュールだけをコンパイルします。アセンブリ内で複数のモジュールをコンパイルしたい場合はcsc.exe実装を使う必要があります。

3. 動的にコード操作を生成する

まず、.NETで各動的型がどの型で表現されているかを理解する必要があります。

アセンブリ:System.Reflection.Emit.AssemblyBuilder(動的アセンブリを定義し表現)

コンストラクタ:System.Reflection.Emit.ConstructorBuilder(動的クラスを定義し表現するコンストラクタ)

カスタム属性:System.Reflection.Emit.CustomAttributeBuilder(コンストラクタが渡すパラメータを使ってクラスの属性を生成するカスタム属性を生成するのに役立ちます)

Enum: System.Reflection.Emit.EnumBuilder(エナム型の説明と表示)

イベント:System.Reflection.Emit.EventBuilder(クラスを定義するイベント)

フィールド:System.Reflection.Emit.FieldBuilder(フィールドを定義し表現します。) そのようなクラスを継承することはできません)

ローカル変数:System.Reflection.Emit.LocalBuilder(メソッドやコンストラクタ内のローカル変数を表現)

Method: System.Reflection.Emit.MethodBuilder(動的クラスを定義し表現するメソッド(またはコンストラクタ)

モジュール:System.Reflection.Emit.ModuleBuilder(動的アセンブリでモジュールを定義し表現)

Parameter: System.Reflection.Emit.ParameterBuilder(メソッドパラメータ、イベントパラメータなどのパラメータ情報を作成または関連付け)

プロパティ:System.Reflection.Emit.PropertyBuilder(プロパティの種類を定義してください)

クラス:System.Reflection.Emit.TypeBuilder(実行時にクラスの新しいインスタンスを定義・作成)

OpCodeは中間言語(IL)指令の記述です。 この件については多くの指示がありますので、公式のMicrosoftウェブサイトを確認してください:ハイパーリンクのログインが見えます。

AssemblyBuilderアクセス制限

AssemblyBuilderAccess.Run; アセンブリは実行可能だが保存はできないことを示します。
AssemblyBuilderAccess.Save; アセンブリは保存可能だが実行はできないことを示します。
AssemblyBuilderAccess.RunAndSave; アセンブリを保存して実行できることを示します。
AssemblyBuilderAccess.ReflectionOnly; アセンブリは反射的な文脈でのみ使用でき、実行できないことを示します。
AssemblyBuilderAccess.RunAndCollect; アセンブリをアンロードしメモリを回収できることを示します。

コードは以下の通りです:

まずemitを使ってILコードを生成し、次にアセンブリを動的に生成し、最後にアセンブリをロードしてメソッドを呼び出します。以下の図に示されています。



ILSpyを使って、下の画像のように生成されたコードを閲覧できます。



(終わり)





先の:Roslyn MSBuildコンパイラの違い
次に:.NET/C# 反射、エミット、表現のパフォーマンステスト
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com