問題タブ [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#-4.0 - 実行時に型を生成する
実行時にプロパティを持つ型を作成する必要があります。タイプは次のようにする必要があります。
問題は Set メソッドを作成する方法ですか?今、私は次のコードを使用します:
しかし、プロパティに値を設定しようとすると、例外がスローされます
c# - C#コンパイルの最適化:null合体演算子-更新-リフレクターのバグ?
こんにちは!C#コンパイラが最適化をどのように実行するかについて少し混乱しています。
「怠惰な」初期化とnullの場合のデフォルト値を構成するために次のゲッターを作成しました。
静的クラスヘルパー:
リフレクターによる分解の結果は次のとおりです。
想定以外の方法で動作するようです...
アップデート
正しく動作します(構成から、上書きされます)が、Reflectorは同じことを示します:
.net - .ILファイルを編集するためのツール?
現在、私はこの目的のためにメモ帳を使用しています。.NET中間言語ファイルを編集するための特定のツールはありますか?
Dotnet IL Editor(DILE)は、ファイルを編集する前に逆アセンブルします。その機能は必要ありません。最も効率的な方法で必要なのは、実際の編集だけです。
c# - Ldvirtftnオペコードをいつどのように使用しますか?
次のサンプルプログラムは、ldvirtftn
オペコードの使用法を把握しようとしているものです。名前が示すように、これは仮想関数ポインタをスタックにロードするときに使用するオペコードです。サンプルコードでは、2つの静的メソッドLdftn
を使用して型を作成しています。これらのメソッドは両方とも、最初の関数Ldvirtftn
のオープンデリゲートを返し、オペコードを使用し、仮想と同様に予期せず動作します。2番目の方法では、無効なプログラムを使用して作成したようです。私は何が間違っているのですか?混乱以外に、このオペコードの目的は何ですか?Base.Method()
Ldftn
ldftn
Base.Method
Ldvirtftn
.net - .NET IL を逆アセンブルしてエラー メッセージを見つける
私のチームは、.NET 内でエラー メッセージが発生している場所を見つけようとしています。.NET はwindows service
、Microsoft によって構築され、私たちのサーバー上に存在する Web サービスをカプセル化し、私たちが使用するビジネス製品をサポートします。Microsoft は、私たちが受け取ったエラーは実際にはエラーの 1 つであると個人的に語っていますが、それがどこで、なぜ発生しているのかを特定することはできません。これは重要なビジネス プロセスであり、私たちのチームに多大な苦痛をもたらします。
このエラーは、私たちが知る限り、ランダムに発生し、スタック トレースを調べて発見できる共通点はありません。スタック トレースの最後の呼び出しは、サービスからの応答を読み取ろうとするメソッド呼び出しであり、サービスへのメソッド呼び出し内でエラーが発生している場所や理由はわかりません。Microsoft Windows サービスは、イベント ビューアにエラーを記録していません。
スローされているリテラル エラー メッセージ文字列を探すことで、このエラーの発生元を追跡したいと考えています。このエラーを生成するメソッド呼び出しを特定できれば、このエラーへの対処方法を絞り込むことに一歩近づくことができます。
このサービスのソース コードにはアクセスできませんが、IL 逆アセンブラー (idlasm.exe) を使用して IL を表示できます。いくつかのアセンブリの IL をダンプしましたが、それらはリテラル文字列ではありません。
IL 内でリテラル文字列を見つけることは可能ですか? エンコードされていると思います。IL について、どこを見ればよいか、IL 内の文字列を特定する方法を判断するのに十分な知識がありません。IL のメソッドを含むリテラル文字列として存在せず、リソースに格納されている場合、エラー メッセージは他にどこにありますか?
アプリ名が置き換えられたスタック トレース。
補足として、このエラー メッセージが表示された時点で十分なメモリが利用可能であり、このエラーが発生すると、その後のすべてのメソッド呼び出しで同じエラーが返されます。Microsoft サービスを再起動することによってのみ治まります。
サイトで使用されているサービスへのすべての呼び出しを絞り込みましたが、このメッセージを再現できません。本番環境で見られるトラフィックの約 1000 倍のトラフィックで開発中のサービスを過負荷にし、(すべてのメモリを消費することによって) メモリ不足の例外を発生させることができますが、「Can be
再帰関数呼び出しが原因です」というメッセージは発生しません。Microsoft が述べている Agian は、Microsoft の製品が具体的にスローする固有のエラーです。
アップデート
.etx
次のようなファイル内のリテラル エラー メッセージを見つけることができました。
@1@15@0@
、@2@1@0@
、および@2@END@0@
は、アセンブリがこれらの文字列を参照するために使用する何らかの参照であると想定しています。これらの文字列を使用するアセンブリの 1 つにこれらを結び付ける方法に関する情報はありますか? @
これまでのところ、シンボルとフォーマットが一致するデータは IL ダンプにないようです。
f# - F#関数の汎用バージョンが無効なILを引き起こしていますか?
そこで、私は小さな二分探索関数を作成しました(必要なわけではありませんが、できるという理由だけで)。たとえば、文字列や整数に固有にする場合は、うまく機能します。ジェネリック型シグニチャーを使おうとすると、例外が発生し始めます。
ジェネリック型を使用した関数のコピー'a
:
これが呼び出されると、次のようになります。
私は何か間違ったことをしていますか?(繰り返しますが、私が使用するとき、string
またはint
その代わりに'a
、すべてが機能します...)
編集:
私はMono2.9かそこらをコンパイルしました、そしてこの関数はFSIで動作します。さて、DebianとUbuntuがアップグレードするのを待つために...:D
c# - DynamicMethodを作成して、プロパティに値を割り当てますか?
これは学習演習です。Fooと文字列を受け取り、Aプロパティを設定するメソッドを作成しました。リフレクターの分解を使用して、次の放出コードを作成しました。分解は次のようになります。
さて、その後、emitコードをモデル化しました。
この例外が発生します:
クランクとはどういう意味ですか、どうすれば修正できますか?
編集:
ターゲットメソッドがプライベートだからかもしれないと思いましたが、よくわかりません。DynamicMethod MSDNページから:
次のコード例は、型に論理的に関連付けられたDynamicMethodを作成します。この関連付けにより、そのタイプのプライベートメンバーにアクセスできます。
.net - 生成された IL コードが Nop で始まるのはなぜですか?
アセンブリの 1 つの IL を (ILDasm 経由で) 調べていたところ、すべてのメソッドが nop
命令で始まっていることに気付きました。
それがなぜなのか誰か知っていますか?
.net - ILにコメントのようなものはありますか?
座って、まっすぐな IL でソフトウェアを開発する人は誰もいないことに気付きました (そうですか?)。しかし、IL コードのスニペット (C# コンパイラなどによる出力) を他の誰かと議論のために共有し、さらにいくつかのコメントで注釈を付けたいとします。テキストを IL として無効にすることなくこれを行うことができるように、IL にコメントの実際の構文はありますか? 大したことではなく、ただの好奇心です。
c# - nullを使用したローカル変数の初期化はパフォーマンスに影響しますか?
2つのコードを比較してみましょう。
と
私はいつも、これらのコードは同じだと思っていました。しかし、これらのコードをビルドし(最適化をチェックしたリリースモード)、生成されたILメソッドを比較した後、最初のサンプルにはさらに2つのIL命令があることに気付きました。
最初のサンプルコードIL:
.maxstack 1
.locals init([0] string str)
IL_0000:ldnull
IL_0001:stloc.0
IL_0002:ldstr "Test"
IL_0007:stloc.0
IL_0008:ldloc.0
IL_0009:call void [mscorlib] System.Console :: WriteLine (文字列)
IL_000e:ret
2番目のサンプルコードIL:
.maxstack 1
.locals init([0] string str)
IL_0000:ldstr "Test"
IL_0005:stloc.0
IL_0006:ldloc.0
IL_0007:call void [mscorlib] System.Console :: WriteLine(string)
IL_000c:ret
おそらく、このコードはJITコンパイラによって最適化されていますか?では、nullを使用したローカルbethod変数の初期化は、パフォーマンスに影響を与えますか(非常に単純な操作であることは理解していますが、どのような場合でも)、回避する必要がありますか?よろしくお願いします。