問題タブ [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.
.net - .net 実行可能ファイルの部分的な逆アセンブル
.net 実行可能ファイルを解析し、外部メソッドへの呼び出しのリストを生成する比較的小さなプログラムを作成する必要があります。たとえばSystem.Console.WriteLine
、ファイル内で が呼び出された場合、ツールはSystem.Console.WriteLine
どこかで呼び出されたものを出力する必要があります。実際の逆アセンブルを実装することはできません (頭脳と時間が限られている) 必要もありません (必要なのは呼び出しのリストだけです)。呼び出された関数の名前と呼び出しが発生したオフセットを書き込む、grep フレンドリーで perl フレンドリーな比較的短いソリューションが必要です 。
私がすでに試したこと:
MSDN から仕様をダウンロードします。
0x28
これで、静的呼び出しがバイトコードに変換されることがわかりました。:) その後にメソッド記述子が続きますが、メソッド記述子が何を意味するのかを理解するには、おそらく仕様全体を読む必要があります。Reflector で単純な exe を開きます。Reflector は元のアプリケーションのコードを正確に再現しましたが、呼び出しのバイトコードを確認できません。
限られた時間と知識で、必要な限られた機能を実装することは可能ですか?
もしそうなら、私はそれを実装するために何を知っていますか? 「ダミー用の CIL アセンブリ」ガイドはありますか?
cil - ECMA CIL/Microsoft MSIL 仕様が大幅に変更されたことはありますか?
.NET Common Intermediate LanguageのECMA 標準は3 回更新されました。バージョン間の変更を明確にするバージョン履歴を見つけることができませんでした。新しいオペコードなど、4 つの間に実質的な違いはありますか?
また、MSILにも同じことが当てはまりますか?
ありがとうございました!
c# - CIL (MSIL) の Stringbuilder
StringBuilder を受け取り、クラス内のすべてのプロパティの値を文字列に書き込むコードを生成しようとしています。私は次のものを持っていますが、現在、次のコードで「無効なメソッドトークン」を取得しています:
何か案は?前もって感謝します :)
.net - .NET DynamicMethod スレッドセーフ?
ILGenerator を使用して DynamicMethod を記述し、出力するコードがスレッド セーフである場合、結果のデリゲートはスレッド セーフになりますか?
私の懸念は、メソッドが初めて実行されたときにILがコンパイルされることです。それが本当なら、コンパイル中に他のスレッドがデリゲートを実行しようとするとどうなりますか?
f# - F# コードのリリース ビルドでの NOP
私は VS2010 ベータ 2 で F# を使用しています。F# は初めてなので、一般的な例の 1 つを選んで、階乗関数を次のように実装しました。
これをビルドし、Reflector で生成されたコードを見ると、対応する C# コードが得られます。
したがって、Reflector の F# コードの C# 表現をコンパイルすると、同一の IL が得られると予想されます。
ただし、これらのスニペットの両方をリリース モードでコンパイルし、生成された IL を比較すると、それらは異なります (機能的には同じですが、それでも少し異なります)。
C# 実装は次のようにコンパイルされます。
F# の実装は、次のようにコンパイルされます。
生成されたコードは、異なる maxstack と F# メソッドの追加の NOP 命令を除いて同一です。
これはおそらく重要ではありませんが、F# コンパイラがリリース ビルドに NOP を挿入する理由が気になります。
誰でも理由を説明できますか?
(私は、F# コンパイラが C# コンパイラと同じレベルの実際のテストを経ていないことを完全に認識していますが、これは非常に明白であるため、キャッチされていたと思います)。
編集:コンパイルコマンドは次のとおりです
(参照アセンブリは簡潔にするために削除されています)。
.net - .NET 式ツリーを新しいアセンブリにリンクする
コンパイラがどのように機能するかをよりよく理解するために、自分のおもちゃ My Toy Language -> MSIL コンパイラを作成しようとしています。構文解析と字句解析が機能し、式ツリーを構築し、System.Linq.Expressions 式ツリー API を使用して、機能するインタープリターを取得しました。ここで、実際の MSIL アセンブリを出力したいと思います。
問題は、これらのアセンブリを実際に構築する方法がわからないことです。MethodBuilderクラスは生の MSIL メソッド本体のみを受け入れるため、式ツリーの生の MSIL を取得する必要があります。Expression.Compile()を呼び出すと、作業デリゲートが返されますが、基になる MSIL を取得できません。MethodInfo.GetMethodBody()を呼び出すと、その特定の子クラスに実装されていないため、InvalidOperationException がスローされます。
そのデリゲートを新しいアセンブリにリンクするにはどうすればよいですか?
c# - MSIL コードへの C# コンパイル
Microsoft C# コンパイラ (CSC.exe) には、中間言語ファイルを出力するオプションがありますか? -S スイッチがGCCで行うようなものですか?
c# - C#コンパイラ+ボクシング+制約付きのジェネリックコード
次のジェネリックメソッド用に生成されたMSILコードを調べてみましょう。
見て:
ただし、上記のジェネリックコードの場合、より効率的なIL表現は次のようになります。
制約から、値が参照型にボックス化されていることがわかります。オペコードの後、ILスタックの値はすでにへの有効な参照になり、ボックスを解除せずに使用できるUnbox.any
ため、オペコードは完全に冗長です。box
!!U
C#3.0コンパイラが制約メタデータを使用してより効率的なジェネリックコードを出力しないのはなぜですか?Unbox.anyは小さなオーバーヘッド(わずか4倍から5倍遅い)を与えますが、このシナリオでより良いコードを出力しないのはなぜですか?
.net - .NET CLR と CIL に関するおすすめの書籍を教えてください。
特定の .NET 言語とは対照的に、CLR、 .NET Framework、およびCILの動作に関する優れた本を知っていますか?
field - MSIL でフィールドを呼び出す前に ldarg.0 を実行する必要があるのはなぜですか?
string
パラメータとして aおよび anを使用して、関数を呼び出したいと思いますInt32
。string
は単なるリテラルです。 は である必要Int32
がありfield
ます。だから私はそれが次のようなものであるべきだと思った:
しかし、これは有効なコードではないというエラーをスローします。追加時
ldfld
うまく動く前に。これはなぜですか? また、フィールドが増えると問題が発生するのでしょうか?