.NETプラットフォーム用の言語のバックエンドを作成しようとしています。Delphiで書かれたフロントエンドとインタプリタ。アンマネージAPIは、タイプ定義のみを許可しますが、MSILの発行は許可しません。
管理されていないコードからMSILを生成する方法は何ですか?Reflection.Emitを使用せず、ILasmを使用してこれを達成しますか?ありがとうございました。
.NETプラットフォーム用の言語のバックエンドを作成しようとしています。Delphiで書かれたフロントエンドとインタプリタ。アンマネージAPIは、タイプ定義のみを許可しますが、MSILの発行は許可しません。
管理されていないコードからMSILを生成する方法は何ですか?Reflection.Emitを使用せず、ILasmを使用してこれを達成しますか?ありがとうございました。
Delphiの.NETコードジェネレータは、適切なヘッダーなどを使用して、x86コード生成と同様に、バイトコードとして直接メモリにILを出力します。つまり、コードジェネレータは、エンコードされたIL形式に対応するバイトや例外テーブルなどを直接出力します。これはAPIではなく、昔ながらの方法で行われます。コードを一度に1バイトずつ記述します。
その後、Delphiの組み込みリンカは、IMetaDataEmit
etcと連携してメタデータを生成IMetaDataEmit::SetRVA
し、コードが実行可能ファイルのどこに配置されるかをメタデータに通知します。メタデータはIMetaDataEmit::SaveToMemory
、リンカーが構築しているPEにコピーアウトされてからコピーアウトされ、それに応じて、メタデータの開始を指すようにCLRヘッダーにパッチが適用されます。
それは多くのコードであり、その多くはDelphiの既存のx86リンカーを介してスレッド化されているため、一部は面倒です。これは、ブランチの最適化や未使用のコードの削除(スマートリンク)などを実行します。厳密に言えば、.NETでは一般的に必要ありません。 。
すべてをやり直す場合は、メタデータを作成するための.NET APIを避け、仕様から直接すべてを生成することができます。APIは最終的に最適化のブラックボックスになり、コンパイルにかなりの時間がかかりました。
管理されていないコードから?TBH、私が持っている最良の提案は、「P / Invokeを使用する」か、「それが何を意味するのかを理解し、それを再実装する」のいずれかです。
アンマネージコードを移植するための何かを見つけたとしても、それが機能したとしても、フレームワークを正確に活用することはできません。そして、それは管理されていないものと管理されているものの間で正確に1:1ではありません。
あなたはそれを難しくしています。Codeplex.comで入手可能なIronyおよびCommonCompilerInfrastructureライブラリがリリースされました。これらは、マネージコードで実装されたコンパイラを対象としています。次のオプションは、IMetaDataAssemblyEmit、IMetaDataAssemblyImport、IMetaDataEmit2などのアンマネージメタデータインターフェイスを使用することです。ただし、これらのCOMインターフェイスはcor.h SDKヘッダーファイルで宣言されており、C /C++プログラムでの使用にのみ適しています。それらに利用できるタイプライブラリはありません。インターフェイス宣言を丹念にコピーするのではなく、これらをDelphi宣言に変換するための何らかのツールが必要になります。それが存在するかどうかわからない。
MSILまたはCILは、基本的に.Netでマシンコードに相当します。言語を解析してそれを機械語に翻訳するとき、あなたが持っているのはコンパイラーです。初期のコンパイラは、通常、任意の言語でマシンコードを手動で生成します。つまり、ソース言語のコマンドまたは式の種類ごとに、それを変換するアセンブラ命令の「テンプレート」を記述します。プログラムの中間表現を処理するときに、対応するテンプレートを選択し、プログラム固有の詳細を入力して、CILを発行します。CILのようなスタックベースの言語の場合、複数のステートメントからのテンプレートをチェーンするのはかなり簡単です。あるステートメントの出力スタックは、次のステートメントへの入力スタックです。
CIL命令セットに精通している必要があります。
コンパイラがアンマネージコードであるという事実は重要ではありません。必要な種類のプログラムからCILテキストを生成できます。準備ができたら、送信してilasm
アセンブリを作成します。