タグ付けされた質問 「cil」

7
スタックの目的は何ですか?なぜそれが必要なのですか?
したがって、私は今、C#.NETアプリケーションのデバッグを学ぶためにMSILを学習しています。 私はいつも疑問に思っていました:スタックの目的は何ですか? ちょうど私の質問を文脈で述べるために: なぜメモリからスタックまたは「ロード」への転送があるのですか?一方、スタックからメモリへの転送または「格納」があるのはなぜですか? それらすべてをメモリに配置しないのはなぜですか? それはより速いからですか? RAMベースだからですか? 効率のため? これを把握して、CILコードをより深く理解できるようにしています。
320 c#  .net  vb.net  cil  .net-assembly 

20
C#やVB.NETではできないMSILでできることは何ですか?[閉まっている]
現在のところ、この質問は、Q&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 .NET言語で記述されたすべてのコードはMSILにコンパイルされますが、MSILを直接使用してのみ実行できる特定のタスク/操作はありますか? MSILでは、C#、VB.NET、F#、j#、その他の.NET言語よりも簡単に処理を実行できます。 これまでのところこれがあります: テール再帰 ジェネリックCo / Contravariance 戻り型のみが異なるオーバーロード アクセス修飾子を上書きする System.Objectから継承できないクラスがある フィルタリングされた例外(vb.netで実行できます) 現在の静的クラス型の仮想メソッドを呼び出します。 値型のボックス版のハンドルを取得します。 try / faultを実行します。 禁止された名前の使用。 値型の独自のパラメーターなしのコンストラクターを定義します。 raise要素でイベントを定義します。 CLRでは許可されているが、C#では許可されていない一部の変換。 非main()メソッドをとして作成し.entrypointます。 ネイティブとの仕事intとネイティブunsigned intに直接タイプ。 一時的なポインタで遊ぶ MethodBodyItemのエミッタバイトディレクティブ System.Exception以外のタイプをスローしてキャッチする 列挙型の継承(未検証) バイトの配列を(4倍小さい)intの配列として扱うことができます。 フィールド/メソッド/プロパティ/イベントにすべて同じ名前を付けることができます(未確認)。 独自のcatchブロックからtryブロックに戻ることができます。 famandassemアクセス指定子にアクセスできます(protected internalfam または assemです) <Module>グローバル関数を定義するためのクラス、またはモジュール初期化子への直接アクセス。
165 c#  .net  clr  cil 

1
C#コンパイラがこの!=比較を>比較のように変換するのはなぜですか?
たまたま、C#コンパイラがこのメソッドを有効にすることを発見しました。 static bool IsNotNull(object obj) { return obj != null; } …このCILに: .method private hidebysig static bool IsNotNull(object obj) cil managed { ldarg.0 // obj ldnull cgt.un ret } …または、逆コンパイルされたC#コードを確認する場合: static bool IsNotNull(object obj) { return obj > null; // (note: this is not a valid C# expression) } どのようにすることを来る!=」と訳されますか>「?
147 c#  cil  il  notnull  binary-operators 

5
Javaの仮想マシンとCLR
MSILとJavaバイトコードの違いと呼ばれる質問への一種のフォローアップとして?、Java Virtual Machineの動作方法とJava Virtual Machineの動作方法の(主な)相違点または類似点。ネットフレームワーク 共通言語ランタイム(CLR)は機能しますか? また、 。ネットフレームワーク CLRは「仮想マシン」ですか、それとも仮想マシンの属性を持っていませんか?

9
C#メソッドのコンテンツを動的に置き換えますか?
私がやりたいのは、C#メソッドが呼び出されたときの実行方法を変更して、次のようなものを書けるようにすることです。 [Distributed] public DTask<bool> Solve(int n, DEvent<bool> callback) { for (int m = 2; m < n - 1; m += 1) if (m % n == 0) return false; return true; } 実行時に、Distributed属性を持つメソッド(既に実行可能)を分析し、関数の本体が実行される前と関数が戻った後にコードを挿入できるようにする必要があります。さらに重要なことに、Solveが呼び出されるコードを変更することなく、または関数の開始時に(コンパイル時に、実行時に実行することが目的です)コードを変更せずにそれを実行できるようにする必要があります。 現時点で私はこのコードを試してみました(tはSolveが格納されている型であり、mはSolveのMethodInfoであると想定しています)。 private void WrapMethod(Type t, MethodInfo m) { // Generate ILasm for delegate. byte[] il = …
108 c#  methods  assemblies  cil  swap 

3
なぜこれ(null ||!TryParse)は条件付きで「割り当てられていないローカル変数の使用」を引き起こすのですか?
次のコードでは、割り当てられていないローカル変数 "numberOfGroups"が使用されます。 int numberOfGroups; if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups)) { numberOfGroups = 10; } ただし、このコードは正常に機能します(ただし、ReSharperはこれ= 10は冗長であると言っています)。 int numberOfGroups = 10; if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups)) { numberOfGroups = 10; } 私は何かが足りないのですか、それともコンパイラが気に入らないの||ですか? これをdynamic問題の原因に絞り込みました(options上のコードの動的変数でした)。問題はまだ残っていますが、なぜこれができないのですか? このコードはコンパイルされません: internal class Program { #region Static Methods private static void Main(string[] args) { …

4
単純なベンチマークでの奇妙なパフォーマンスの増加
昨日 、2つのポイント構造体(タプル)を追加するメソッドのいくつかの言語(C ++、C#、Java、JavaScript)のベンチマークとなった「.NET Struct Performance」というタイトルのChristoph Nahrの記事を見つけましたdouble。 結局のところ、C ++バージョンは実行に約1000ミリ秒(1e9反復)かかりますが、C#は同じマシン上で〜3000ミリ秒を下回ることはできません(x64ではパフォーマンスがさらに低下します)。 自分でテストするために、C#コード(およびパラメーターが値で渡されるメソッドのみを呼び出すように少し簡略化)を取り、i7-3610QMマシン(シングルコアの場合は3.1Ghzブースト)、8GB RAM、Win8で実行しました。 1、.NET 4.5.2を使用して、RELEASEビルド32ビット(私のOSは64ビットであるためx86 WoW64)。これは簡略版です: public static class CSharpTest { private const int ITERATIONS = 1000000000; [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Point AddByVal(Point a, Point b) { return new Point(a.X + b.Y, a.Y + b.X); } public static void Main() { Point a = …

3
MSILメソッドでのhidebysigの目的は何ですか?
ildasmとC#プログラムを使用する static void Main(string[] args) { } 与える: .method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 2 (0x2) .maxstack 8 IL_0000: nop IL_0001: ret } // end of method Program::Main hidebysigコンストラクトは何をしますか?
92 cil 

7
「k + = c + = k + = c;」にインライン演算子の説明はありますか?
次の操作の結果の説明は何ですか? k += c += k += c; 次のコードからの出力結果を理解しようとしました: int k = 10; int c = 30; k += c += k += c; //k=80 instead of 110 //c=70 現在、私は "k"の結果が80である理由を理解するのに苦労しています。なぜk = 40を割り当てても機能しないのですか(実際、Visual Studioはその値が他で使用されていないことを通知しています)。 なぜkは110ではなく80なのですか? 操作を次のように分割した場合: k+=c; c+=k; k+=c; 結果はk = 110です。 私はCILを調べようとしましたが、生成されたCILの解釈はそれほど深くなく、いくつかの詳細を取得できません。 // [11 13 - 11 24] IL_0001: …


19
CIL nopオペコードの目的は何ですか?
私はMSILを調べていますが、MSILには多くのnop命令があることに気づきました。 MSDNの記事によると、これらはアクションを実行せず、オペコードにパッチが適用されている場合はスペースを埋めるために使用されます。これらは、リリースビルドよりもデバッグビルドで多く使用されます。 これらの種類のステートメントがアセンブリ言語で使用されて後の命令を調整することは知っていますが、MSILでMSIL nopが必要なのはなぜですか? (編集者注:受け入れられた回答は、質問が最初に尋ねたMSIL / CIL NOPではなく、マシンコードNOPに関するものです。)
82 assembly  bytecode  cil 



1
IntPtrをInt64に変換:conv.u8またはconv.i8?
私は、ILGeneratorを使用してILフラグメントを放出するのに役立つ拡張機能に取り組んでいExpressionます。整数変換の部分に取り掛かるまで、すべてが順調でした。私には本当に直感に反するものがあります。 conv.i8に変換するInt32ために使用UInt64 conv.u8に変換するUInt32ために使用Int64 これらはすべて、評価スタックが整数の符号を追跡しないためです。その理由は完全に理解しています。処理するのは少し難しいです。 今、私はを含む変換をサポートしたいと思いIntPtrます。長さが可変であるため、トリッキーになる必要があります。私はC#コンパイラーがそれをどのように実装するかを調べることにしました。 今特定に焦点を当てIntPtrにInt64変換。どうやら望ましい動作は次のとおりです。64ビットシステムでは何もしないか、32ビットシステムでは符号拡張します。 C#ではstruct native intによってラップされてIntPtrいるため、そのInt64 op_Explicit(IntPtr)メソッドの本体を確認する必要があります。以下は、.NETコア3.1.1のdnSpyによって逆アセンブルされます。 .method public hidebysig specialname static int64 op_Explicit ( native int 'value' ) cil managed { .custom instance void System.Runtime.CompilerServices.IntrinsicAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void System.Runtime.Versioning.NonVersionableAttribute::.ctor() = ( 01 00 00 00 ) .maxstack 8 IL_0000: …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.