メイン コンテンツにジャンプします

なぜナタシャが必要なのですか?

知識の予備

これまでのところ、ダイナミックコンパイルとは何か、Emitがどのようなシナリオで使用するか、式ツリーがどのように使用されるのか、まだ理解していない学生は、食の記事など、最初に学習するための資料を探

現代的な柱

動的コンパイルは、現代の .NET エコロジーを支える重要な柱の 1 つであり、このテクノロジはさまざまな公式および非公式のライブラリに "サービス" されています。動的コンパイルの核となるのは MSIL で、IL コードの作成は Emit テクノロジを公式に提供しますが、Emit の記述と保守は苦痛であり、構文糖の復元、非同期メソッド、命令の互換性、大量のメタデータ操作、エラー デバッグ、動的オートマトン、複雑なビジネスの動的構築など、500 行の EmitCode の前では、ほとんどの人が 200 行のジャンプ ラベルの前で耳をつんざくなど、痛みを伴います。 このコストのかかる表現は、オープンソースプロジェクトの作者だけが知っているのかもしれない。

このことはとても重要なのに、なぜカプセル化しないのですか?公式には、比較的人間的な式ツリーが提供されていますが、これは単に書き込みの容易さを向上させるだけでなく、式ツリーに基づく構成や解析など、いくつかの新しいことを追加します。

解決への道

Roslyn の登場により、Emit を透明にし、C# コードを使用して動的にコンパイルできるエコロジーの希望が生まれています。これは王道、兄弟、これは新しい時代の大きな輝きです。このスキームは、鳥銃の銃の交換に当てはまではなく、一部の人々は、公式の態度を気にする可能性が高い、ここで言うことができる、公式は、あなたが管理することができる問題を扱うことができる場合を含め、この技術は、参照依存、エラー処理、サブドメインロードなどの問題を引き起こす。一連の調査、照合、テストの後、Natasha は 2019 年に一般向けに正式にリリースされ、現在 netcore/net5 リリースで安定版をリリースしており、この 2 年間は統合からデカップリング、中ルールから新しい技術アプリケーションまで、Natasha は> の> と> の洗練から> 光までの道を歩み始えています。次に、Natasha のアプリケーションを例にとり、詳しく説明します。

プロジェクトの初見

Natasha は MIT オープンソース プロトコルを採用しており、DotNetCore.Natasha.CSharp を参照して Natasha を使用できるという実戦的なテストを受けています。

Natasha の最も基本的なコンパイル単位は AssemblyCSharpBuilder で、多くのプロパティがあります。

  • CompileErrorBehavior コンパイルエラーの動作。デフォルトでは例外がスローされます。
  • SyntaxErrorBehavior 構文エラーの動作 。デフォルトでは例外がスローされます。
  • AssemblyOutputKind アセンブリは、ファイル ストリームまたはメモリ ストリームに出力されます。
  • OutputFolder アセンブリ出力ディレクトリ、デフォルトは現在の APP の DynamicLibraryFolders ディレクトリです。
  • CustomUsingShut は、顧客がカスタマイズした using 参照を使用します。

ランダムなドメインに Test クラスを生成します

Natasha コンパイル コンポーネントと環境の初期化
NatashaInitializer.Preheating();
// コンパイルユニットを作成し、アセンブリ名を指定します
AssemblyCSharpBuilder oop = new AssemblyCSharpBuilder ("myAssembly");)
//コンパイルユニットは、ドメイン管理から割り当てられたランダムドメインを使用してオペ
。 Domain = DomainManagement.Random(); コンパイル単位にコードを
oop に //増加
Add(@"namespace HelloWorld{ public class Test{ public Test(){ Name = null; } public string Name; } }");
// 短い名前に基づいてアセンブリ内のクラスを取得し、長い名前は "HelloWorld.Test"
Type = oop. GetTypeFromShortName("Test");

上記の文字列の構造を示しており、Natasha は NClass などの操作を簡略化するための多くのテンプレートを提供し、上記のコードは次のように変換できます。

var type = NClass
. RandomDomain()
. Namespace("HelloWorld")
. Name("Test")
. Ctor(item => item. Public(). Body("Name = null;" ))
. PublicField<string>("Name")
. GetType();

このアセンブリは、type を使用できる即時ドメインに属していることに注意してください。 DisposeDomain() は、GC がアンロードできるように参照を削除します。 メインドメイン(プログラム開始ドメイン)は共有ドメインとも呼ばれ、ランダムドメインはメインドメイン内のタイプとデータを取得することができ、ランダムドメイン間の呼び出しは許可されず、この機能は、プラグインプログラミングの背後にも大きな役割を果たします。

単純なシナリオ

ここでは、Natasha を使用してクラスを構築する方法を学びました, AOP プロキシ クラスの実装など、いくつかの簡単なシナリオを自分で実行しようとすることができます, AOP プロキシクラスについて十分な知識があれば, 私は5分でXiaochengを持つことができると信じています.

以前に書かれた例があり、参考にすることができる. Contoller は動的 API 機能のために動的に構築することもできますが、MVC/WebAPI に関する知識が必要です。 また、FreeSql などの CodeFirst 対応 ORM と組み合わせて、プログラムの初期化時にテーブル構造を作成することもできます。

Natasha は現実的でダイナミックな実戦プロジェクトであり、上記の例は、要件や思考がなければ、ハードカバーを生きないように助言する必要があります。

計画

この記事は、ナタシャの氷山の一角を明らかにし、その後、より多くの技術とアプリケーションを探索します。