問題タブ [cil]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C# や VB.NET ではできなくて MSIL でできることは何ですか?
.NET 言語で記述されたすべてのコードは MSIL にコンパイルされますが、MSIL を直接使用しないと実行できない特定のタスク/操作はありますか?
また、C#、VB.NET、F#、j#、またはその他の .NET 言語よりも MSIL の方が簡単に処理できるようにしましょう。
これまでのところ、次のようになっています。
- 末尾再帰
- Generic Co/Contravariance (C# 4 および VB 10 で許可)
- 戻り値の型だけが異なるオーバーロード
- アクセス修飾子をオーバーライドする
- System.Object から継承できないクラスがある
- フィルタリングされた例外 (VB および C# 6 で許可)
- 現在の静的クラス型の仮想メソッドを呼び出しています。
- ボックス化されたバージョンの値型のハンドルを取得します。
- 試行/障害を実行します。
- 禁止された名前の使用。
- 値の型に対して独自のパラメーターなしのコンストラクターを定義します。
- 要素でイベントを定義します
raise
。 - 一部の変換は CLR では許可されていますが、C# では許可されていません。
- 非
main()
メソッドを として作成し.entrypoint
ます。 - ネイティブ
int
およびネイティブunsigned int
型を直接操作します。 - 一時的なポインターで遊ぶ
- MethodBodyItem の emitbyte ディレクティブ
- System.Exception 以外の型をスローしてキャッチする
- 列挙型を継承する (未確認)
- バイト配列を (4 倍小さい) int 配列として扱うことができます。
- フィールド/メソッド/プロパティ/イベントをすべて同じ名前にすることができます(未確認)。
- 独自の catch ブロックから try ブロックに戻ることができます。
- famandassem アクセス指定子にアクセスできます (
protected internal
famまたはassem ですが、C# 7.2 および VB 15.5 では許可されています)。 <Module>
グローバル関数またはモジュール初期化子を定義するためのクラスへの直接アクセス。- 非ゼロ バインドの 1 ベースの配列を作成して使用する
- オープン インスタンスとクローズド静的デリゲート、およびゲッター/セッターのデリゲートを作成する
- 一時変数を使用せずに 2 つの値を交換する
- 任意の名前での明示的なインターフェイスの実装、および 2 つのインターフェイス関数の 1 つの実装 (VB で実行可能)
- 宣言
vtfixup
(extern
C に相当) - 任意
modopt
または指定modreq
c# - このコンパイラで生成された列挙子はどういう意味ですか?
かなり複雑なyield-returnsメソッドを作成しIEnumerable<string>
ましたが、Reflectorでコンパイラーの出力を調べたところ、コンパイラーによって生成された実装の特定の部分がわかりませんでしたIEnumerator
。
switch
リフレクターがアウターの閉じブレースを置き忘れたので、その直後にあるはずだと推測(または期待)していreturn
ます。それでも、ケース3に空のスイッチがある理由、またはブロックm__Finallya
で呼び出されている理由がわかりません。finally
(通常の実行とブロック内での実行の間に意味上の違いはありfinally
ますか?コードにないCER以外です。)
参考までに、ILは次のとおりです。
c# - .net逆アセンブラ/逆コンパイラ
.net用の逆アセンブラ以上の逆コンパイラを探しています。前任者の一人が書いたアセンブリのソースコードがなくなってしまったので、それが何をしているのか見てみたいと思います。
ildasmにはVisualStudioのインストールが付属しているので、MSILにアクセスできますが、C#コード(または最適な近似値)に戻るのに十分な賢いプログラムがあることを期待していました。
このためのツールはありますか?
(そうでない場合は、座ってMSILを学び始めるのは良い言い訳になると思います)
.net - beforefieldinit フラグは何をしますか?
beforefieldinit フラグは何をしますか? クラスの IL を調べると、このフラグが表示されますが、このフラグが実際に何をしているのかわかりません。
.net - .NETでは、クラスインスタンス/インターフェイスをパラメータとして渡すときに、1つのオブジェクトまたは完全なvtableを渡しますか
インターフェイスまたはクラスのインスタンスをパラメーターとして渡す場合、インスタンスでメソッドを呼び出すと、vtableを再帰的に呼び出し、適切なものを正しく呼び出す必要があるため、多くのオブジェクトまたは完全なvtableを渡しますか?
これはどのように作動しますか?
c# - JIT をオフにし、MSIL (独自の VM) でコードフローを制御する
私は C# で独自のスクリプト言語を作成しており、いくつかの機能を気に入っています。MSIL を出力のバイトコードとして使用することにしました (Reflection.Emit は非常に便利で、別のバイトコードを考える必要はありません)。それは機能し、実行可能ファイルを発行します。これは実行可能で (Reflector で逆コンパイルすることもできます:))、非常に高速です。
しかし - 1 つのプロセス + 1 つのスレッドで複数の「プロセス」を実行し、割り当てられた CPU 時間を手動で制御したい (.NET フレームワークによって提供されるより堅牢な IPC も実装する) JIT を完全に無効にして独自のプロセスを作成する方法はありますかVM、.NET フレームワーク (およびメモリ使用量の制御など) を使用した命令ごとのステップ実行、自分で何かを記述する必要なし、またはこれを達成するには、MSIL 解釈全体を記述する必要がありますか?
編集 1): IL の解釈は、宇宙で最速のものではないことを知っています :)
編集2):明確にするために-VMをある種の「オペレーティングシステム」にしたい-CPU時間を取得し、プロセス間で分割し、それらのメモリ割り当てを制御します。高速である必要も効果的である必要もありませんが、私の実験の概念実証にすぎません。すべての命令を処理するレベルでそれを実装する必要はありません。これを .NET で実行する必要がある場合は、気にしません。言いたいのは、1 つの命令をステップ実行し、次のステップを指示するまで待つことです。
編集 3): 私は、ICorDebug がおそらく私のニーズを達成できることに気付きました。今、Mono のランタイムの実装を調べています。
ide - MSIL の IDE
SO の MSIL に関する質問はたくさんありますが、これに直接答えるものはありません。
MSIL の構文定義ファイルを含むTextpadを使用してから、コマンド プロンプト ウィンドウで ILASM を使用しています。
ILIDE への参照は見つかりましたが、リンクが壊れています。
構文の強調表示、インテリセンス、コード補完、デバッグなどを可能にする MSIL 用の Visual Studio / Eclipse への IDE またはアドオン / プラグインはありますか?
debugging - MSIL デバッガー - Mdbg、Dbgclr、Cordbg
私はいくつかの MSIL 作業を行っており、これら 3 つのデバッガーへの参照に出くわしました。
それらの違いは何ですか?
それらの 1 つは、他の wrt よりも優れています。機能?
私が見逃した他の人はいますか?
cil - MSIL メソッドでの hidebysig の目的は何ですか?
ildasm と C# プログラムの使用例
与えます:
hidebysig コンストラクトは何をしますか?