問題タブ [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# - 実行された IL 命令の数をカウントする方法はありますか?
C# プロセスのベンチマークを行いたいのですが、時間をベクトルとして使用したくありません。特定のメソッド呼び出しで実行される IL 命令の数を数えたいのです。これは可能ですか?
編集メソッド本体の静的分析を意味するのではありません-実行される実際の命令数を指しています-したがって、たとえば、メソッド本体にループが含まれている場合、カウントは多くの命令が作成した分だけ増加しますup the loop * ループが繰り返される回数。
cil - CIL スタック交換命令
スタック内の最初の 2 つの要素を交換する CIL 命令はありますか?
.net - コールとCallvirt
CIL命令「Call」と「Callvirt」の違いは何ですか?
c# - ILGenerator の適切なラッパーはありますか?
System.Reflection.Emit をしばらく使用していますが、バグが発生しやすいのと同じくらい苦痛です (そうでない人はいませんか?)。
SRE を直接操作するよりも安全で簡単な方法で IL を生成するために信頼できる、IL ジェネレーターの優れたラッパーがあるかどうか知っていますか?
編集:
式ツリーを操作することは、IL を直接出力するよりも断然簡単で安全であることはわかっていますが、現時点ではいくつかの制約もあります。コード ブロックを作成したり、ループを使用したり、複数のローカル変数を宣言して操作したりすることができません。.NET 4 がリリースされるまで待つ必要があります :)
さらに、既に SRE に依存しているコード ベースを扱っています。
明らかに、ILGenerator は私が必要とするすべてを行います。しかし、それを操作するときは、もっと助けていただければ幸いです。かなり低いレベルのままである ILGenerator ラッパーについて言及しているとき、次のようなメソッドを提供できるものについて考えます。
これは実際には 3 つの素朴な例ですが、私の予想を示すには十分かもしれません。これは一連の拡張メソッドとして見ることができますが、RunSharpのように条件付きステートメントとループをサポートすると便利です。実際、RunSharp は私が望むものにかなり近いですが、ILGenerator を抽象化しすぎて、そのすべての機能を公開していません。
どこかは思い出せませんが、オープンソース プロジェクトでそのようなヘルパーを見たことがあります。
c# - イベントが .NET でデリゲートとして実装されている場合、.event IL セクションのポイントは何ですか?
デリゲート、イベント、およびこれら 2 つの機能の .NET 実装に関するスタック オーバーフローに関する非常に良い質問をいくつか見てきました。特に、「C# イベントは舞台裏でどのように機能しますか?」という 1 つの質問は、いくつかの微妙な点を非常によく説明する優れた回答を生み出しました。
上記の質問に対する答えは、次の点を指摘しています。
フィールドのようなイベントを宣言すると、コンパイラはメソッドとプライベート フィールド (デリゲートと同じ型) を生成します。クラス内で ElementAddedEvent を参照するときは、フィールドを参照しています。クラスの外では、フィールドを参照しています
同じ質問 (「フィールドのようなイベント」)からリンクされた MSDN の記事には、次のものが追加されています。
イベントを発生させるという概念は、イベントによって表されるデリゲートを呼び出すこととまったく同じです。したがって、イベントを発生させるための特別な言語構造はありません。
さらに詳しく調べたいので、イベントとデリゲートがコンパイルされる IL を表示するために、テスト プロジェクトを作成しました。
デリゲート フィールドhandler
とイベントFooEvent
はほぼ同じ IL コードにコンパイルされ、コンパイラによって生成されたFooEvent
フィールドへのアクセスをラップするメソッドがいくつか追加されることを期待していました。しかし、生成された IL は、私が期待したものとはまったく異なりました。
add
イベントは、コンパイラによって生成されたおよびメソッドを持つデリゲートにすぎないためremove
、IL でイベントがそれ以上のものとして扱われるとは思っていませんでした。ただし、 add メソッドと remove メソッドは、通常のメソッドとは 異なり.event
、で始まるセクションで定義されています。.method
.event
私の最終的な質問は次のとおりです。イベントがアクセサー メソッドを持つデリゲートとして単純に実装されている場合、 IL セクションを持つ意味は何ですか? .method
セクションを使用して、これなしで IL に実装できませんでしたか? と.event
同等.method
ですか?
assembly - CIL nop オペコードの目的は何ですか?
MSIL を調べていると、MSIL に多くのnop命令があることに気付きました。
MSDN の記事によると、オペコードにパッチが適用された場合、何もアクションを起こさず、スペースを埋めるために使用されます。これらは、リリース ビルドよりもデバッグ ビルドで多く使用されます。
これらの種類のステートメントがアセンブリ言語で使用され、後の命令を調整することは知っていますが、なぜ MSIL で MSIL nops が必要なのですか?
(編集者注:受け入れられた回答は、質問が最初に尋ねたMSIL / CIL NOPではなく、マシンコードNOPに関するものです。)
asp.net - MSIL から JavaScript への自動変換は役に立ちますか?
私は、MSIL (コンパイルされた C# または VB.NET) を JavaScript に変換するAxialというプロジェクトに取り組んでいます。動作するコードのサンプルがいくつかありますが、いくつかの一般的な状況では適切に動作しません。(現在のリリースはプロダクション モードでは動作せず、SVN コードはデバッグ モードでは動作しませんが、はるかにクリーンです。) JavaScript を書くのが嫌いだという話をかなりの数の人から聞いたので、プロジェクトにいくつかの機能があることは知っています。メリットはありますが、その態度は SO コミュニティではあまり普及していないと思います。
製品が完全かつスムーズに動作すると仮定すると、JavaScript は常に 100% 動作し、Visual Studio プラグインによって製品が正しく使用されていることが保証されます。これはあなたまたはあなたの組織が使用するものですか? 直接的なコード変換以外に興味のある機能は何ですか?
c# - 基本クラスのイベント ハンドラーを呼び出す MSIL は何ですか?
イベント EventConsumed とメソッド OnEventConsumed を次のように定義する EventConsumer というクラスがあります。
OnEventConsumed ランタイムに属性を追加する必要があるため、System.Reflection.Emit を使用してサブクラスを生成しています。私が欲しいのは、これに相当する MSIL です:
私がこれまでに持っているのはこれです:
型を作成し、型のインスタンスを作成し、その OnEventConsumed 関数を呼び出すと、次のようになります。
...これはまったく役に立ちません。私は何を間違っていますか?基本クラスのイベント ハンドラーを呼び出す正しい MSIL は何ですか?
c# - c#で自動プロパティを使用するために構造体で:this()を呼び出す必要があるのはなぜですか?
次のような自動プロパティを使用して C# で構造体を定義するとします。
ファイルをビルドしようとすると、コンパイル エラーが発生しますThe 'this' object cannot be used before all of its fields are assigned to
。これは、コンストラクターを変更して、次のようにデフォルトのコンストラクターへの連鎖呼び出しを行うことで解決できます。
私の質問は、なぜこれが機能するのか、何が起こっているのかということです。私は推測を持っており、IL を見てそれを証明しようとしましたが、IL を分解できると思うかどうかは冗談です。しかし、自動プロパティは、コンパイラが舞台裏でプロパティのフィールドを生成することで機能すると思います。これらのフィールドにはコードからアクセスすることはできません。すべての設定と取得は、プロパティを通じて行う必要があります。構造体を作成するとき、既定のコンストラクターを明示的に定義することはできません。そのため、舞台裏では、開発者が見ることができないフィールドの値を設定するデフォルトのコンストラクターをコンパイラーが生成している必要があります。
すべての IL ウィザードは、私の理論を証明または反証することを歓迎します。
.net - CILをバイナリにコンパイルするためのツールはありますか?
以前の投稿「.NET言語でプログラムされたアプリケーションを古いマシンで動作させる」を見た後、私は疑問に思う必要があります。
CILをバイナリにコンパイルするためのツールはありますか?
その場合、ユーザーに.NET Frameworkを要求させたくない場合は、CILファイルをネイティブWindowsアプリに変換できますか?または、.NETからLinuxプラットフォームをターゲットにすることもできます。それは素晴らしいでしょう!