問題タブ [il]
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の短い形式の命令は短くありませんか?
Reflector で有効なメソッドの IL コードを見ていましたが、これに遭遇しました:
接尾辞が付いた命令.s
は int8 オペランドを取ることが想定されており、確かにこれは Leave_S にも当てはまります。ただし、0x0103 は 259 であり、int8 の容量を超えています。メソッドは何とか機能しますが、メソッドMono.Reflection.Disassembler.GetInstructions
で指示を読むと取得されます
つまり、int8 であるはずなので、259 ではなく 3 です。それで、私の質問: 元の指示 ( leave.s L_0103
) はどのように可能ですか? そのための ECMA ドキュメント( Partition III: CIL Instruction Set ) を見ましたが、それを説明するものが見つかりません。
何か案は?ありがとう。
編集#1:わかりました、私はばかです。分岐命令の場合、オフセットは現在の命令に続く命令の先頭からカウントする必要があります。ドキュメントを読んだことを誓いますが、どういうわけかそれをスキップすることができました。断言しますが、今日はかなり具合が悪いです。はぁ。
ありがとうございました。(そして、これはかなりばかげていたにもかかわらず、私をばかと呼ばないでくれてありがとう:P)
編集#2:ちなみに、誰かが興味を持っている場合Mono.Reflection.Disassembler.GetInstructions
、命令を逆アセンブルすると、分岐命令のオペランドの意味が変わります。特に、指摘されているように、分岐命令のオペランドは、 0 からではなく、次の命令の先頭からのオフセットを表します。しかし、0 からMono.Reflection
始まるオフセットを返します (これが、私が混乱した理由かもしれませんが、ドキュメントの一部をスキップした方法については説明していません)。
の抜粋MethodBodyReader.ReadOperand(Instruction instruction)
:
ご覧のとおりil.position
、次の命令のオフセット (0 から始まる) を追加します。また、それは にキャストされsbyte
ます。これが、259 ではなく 3 を取得している理由です。これはバグのようです (0 から始まるオフセットは よりも大きい可能性がありますsbyte
)。Jb Evain (作者) に聞いて報告します。
編集#3:彼はまだ答えていませんが、私はそれを次のように変更しました:
そして、それは私の問題を解決したようです。sbyte
逆方向へのジャンプ (負のオフセット) の場合に備えて、符号を正しく取得するために にキャストし、 il.position
( であるint
) を追加すると、結果はint
.
とにかく彼の言うことをあなたに知らせます。
編集 #4 : 報告するのを忘れていました。作者はこれがバグであることを認めています。
.net - .NET アセンブリが同じソースからビルドされたかどうかを判断する
2 つの .NET アセンブリを比較して、それらが「同じ」ソース ファイルからビルドされたかどうかを判断する方法を知っている人はいますか?
Reflector のプラグインなど、いくつかの差分ユーティリティが利用できることは承知していますが、GUI で差分を表示することに興味はありません。同じ (または同等の) ソース ファイル。複数の異なるソース ファイルが同じ IL を生成する可能性があることを理解しており、そのプロセスは元のソースではなく、IL の違いにのみ影響を受けることを認識しています。
2 つのアセンブリのバイト ストリームを比較するだけの主な障害は、.NET にアセンブリに "MVID" (Module Version Identifier) と呼ばれるフィールドが含まれていることです。これは、コンパイルごとに異なる値を持つように見えるため、同じコードを 2 回ビルドすると、アセンブリが異なります。
関連する質問は、コンパイルごとにMVIDを強制的に同じにする方法を知っている人はいますか? これにより、MVID の値の違いに影響されない比較プロセスを使用する必要がなくなります。標準のチェックサムを使用できることを意味するため、一貫した MVID が望ましいでしょう。
この背景には、本番環境へのリリースが許可される前に、サードパーティ企業がリリースを独自にレビューして承認する責任があるということがあります。これには、ソース コードのレビューが含まれます。彼らは、私たちが提供するソース コードが、私たちが以前に構築、テストし、現在展開を計画しているバイナリと一致することを独自に確認したいと考えています。私たちが提供するソースからシステムを独自に構築し、チェックサムをテスト済みのバイナリのチェックサムと比較できるプロセスを探しています。
ところで。継続的インテグレーション、自動ビルド、ソース管理などを使用していることに注意してください。この問題は、特定のビルドにどのソース ファイルが入ったかを内部で制御できないこととは関係ありません。問題は、サード パーティが、サード パーティに提供するソースが、テスト済みで本番環境に入れる予定のバイナリと同じバイナリを生成することを確認する責任があることです。ビルド サーバーやソース コード管理システムを含め、内部システムやコントロールを信頼するべきではありません。彼らが関心を持っているのは、ビルドに関連付けられたソースを取得し、ビルド自体を実行し、出力がデプロイしようとしているものと一致することを確認することだけです。
比較ソリューションの実行速度は特に重要ではありません。
ありがとう
cil - MSILでの短絡評価はどのように機能しますか
msilインタープリターでの短絡評価はどのように機能しますか?And命令には、falseの場合にジャンプする場所に関する情報が含まれていますか?また、Orの場合も同じですか?
c# - ac#メソッドをトラバースし、メソッド本体をanazlyeします
C#でmethodinfoをトラバースする最も簡単な方法は何ですか?
メソッド本体をトラバースしてフィールド参照などを見つけ、型を取得したいと思います。
System.Reflectionには次のものがあります。
これはちょっと低レベルで、体を横断する前に「いくらかの」作業が必要になります。
Cecilが存在することは知っていますが、メモリ内のアセンブリをcecilでロードする際に問題があります。私が使用しているアセンブリは、常に「ディスク上」にあるとは限りません。たとえば、からコンパイルされたメモリ内アセンブリである可能性があります。ブー、そして私はアセンブリを一時的にディスクに書き込むことなしにクリーンな解決策を望んでいません。
これには他にどのような選択肢がありますか?
.net - CLR 4.0で導入されたOpCodeは何ですか?
3.5と比較して.NET4.0で新しいILオペコードはありますか?ある場合、それらのリストはどこにありますか?
.net - アセンブリから特定の IL (.NET Intermediate Language) 署名を抽出するメカニズム
クラスとそのメンバーの IL 署名を抽出する必要がある Microsoft .NET アセンブリ mscorlib.dll で見つかった約 25 の型のリストがあります。タイプごとに 1 つのファイルが必要で、各署名が 1 行に表示されます。たとえば、次のタイプを使用します。
その型のアセンブリから次のものを抽出したいと思います (必要のないプライベート メンバーがいくつかありますが、必要に応じて手動で処理できます)。
そこで、これを達成するための 4 つの方法を考えました。
各タイプの各署名を手動で切り取り、ildasm のテキスト ファイルに (直接または mscorlib.dll のダンプを介して) 貼り付けます。一部のタイプはかなり長いため、これは面倒な作業になる可能性があります。さらに多くのことを行う必要がある場合、これは間違いなく長期的な解決策ではありません。
Reflection を使用してすべての署名を取得しようとするツールを作成します。大まかに言えば、以下の疑似コード [1] のようなものを使用することを考えました。
ildasm の IL ダンプで文字列解析を使用して型を見つけて署名を取得するツールを作成する
タスクを実行するには、既存のツールを使用します。
私のタスクを達成するのに役立つ既存のツールまたはメカニズムを知っている人はいますか? そうでない場合、そのようなツールを作成するためにどの方向に進むべきかについての提案はありますか? また、それを実現する方法についてコードのアイデアがあれば、聞いていただければ幸いです。
[1]
mono - モノラル ランタイムは、IL 仕様で要求されているテール コールの最適化を既に処理していますか?
私はこの悪名高い投稿でそれを知っています
http://flyingfrogblog.blogspot.com/2009/01/mono-does-not-support-tail-calls.html
モノラル ランタイムは、IL が要求するテール コールの除去を提供しませんでした。これはその後変更されましたか?
c# - EmitCall は、Silverlight で「操作はランタイムを不安定にする可能性があります」を発生させます
私は IL 言語で n00b です。私の仕事では、から継承された動的タイプを作成する必要がありますSystem.ServiceModel.DomainServices.Client.Entity
。プロパティの set メソッドにコードを追加すると、「操作によりランタイムが不安定になる可能性があります」というメッセージが表示されます。その問題を解決してください。
リフレクターからのコード:
私のコード:
vb.net - コード生成を使用してハンドラーを動的に追加することにより、イベントをキャッチします
アプリケーション内のすべてのイベントをフックして、すべての情報(発生、引数など)を追跡する必要があります。
Stackoverflowでこれを見つけました: VB.NETのすべてのイベントをトレースします
ただし、呼び出されたイベントをコンソールに書き込むだけでなく、senderとeventargsを示すパラメーターを使用してTraceVerboseを呼び出すソリューションが必要です。
私はまだ動的コード生成とILを理解するために取り組んでいるので、イベントからのパラメーターを使用してトレースメソッドを呼び出すコードを取得する方法についての手がかりがありません。
誰かがこれを行う方法を教えてもらえますか(VB.NETで)?
visual-studio - Visual Studio プロジェクト内から CIL コードをコンパイルする例はありますか
Visual Studio は CIL/MSIL プロジェクトをサポートしていないという質問と回答が寄せられていることを認識しています。MSBuildContribプロジェクトには、ビルド時に IL ファイルをコンパイルできる ILASM タスクがあります。
このタスクの使用方法の例については、Google で検索しても何も見つかりませんでした。
Visual Studio ソリューションの一部として ILASM を使用する例はありますか? #develope と ILIDE が CIL をサポートしていることに気づきました...ここでの目的は、Visual Studio ソリューションの一部としていくつかの CIL ファイルをコンパイルすることです。