問題タブ [ilspy]
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-4.5 - ILSpy またはその他のツールを使用して、.NET フレームワークのどのコードが特定の例外メッセージを生成したかを調べるにはどうすればよいですか?
たとえば、「プリンシパル サーバーに接続しようとしているときに、このエラーが発生しました」など、標準的な英語と米国のカルチャで実行しているときに、フレームワークによって生成された特定の例外メッセージが少しあるとします。メッセージにこのテキストを含む例外を生成するフレームワークのコードを特定するにはどうすればよいですか?
フレームワーク コードは、最終的に例外をスローする前に、いくつかのレベルのヘルパー メソッドを使用して例外を生成することが多いため、スタック トレースが常に役立つとは限りません。
文字列はローカライズされていると思います。そのため、ILSpy の定数内で文字列を見つけることができません。文字列は一意のリソース ID などで保存され、その ID によって参照されると思いますが、どこから ID を見つければよいのかわかりません...
razor - ILSpy (別名 .NET Reflector) は、メソッドを自分自身を呼び出しているだけとして表示します。なぜですか?
匿名型を TextBox などの HtmlHelper メソッドに渡すと、RouteDataDictionary を使用してメンバーを抽出しない限り、バインド エラーが発生します (匿名型のメンバーは内部アクセスしかできないため) 。
(HtmlHelper 拡張機能) InputExtensions.TextBox メソッドが匿名型を受け入れることを確認したとき、内部で何らかの変換を行う必要があるか、同じエラーで失敗することがわかりました。
案の定、それは HtmlHelper.AnonymousObjectToHtmlAttributes メソッドを呼び出します。このメソッドのドキュメントは、問題に言及しないことで問題を軽視しようとします。代わりに、アンダースコアをダッシュに置き換えて、有効な属性名が使用されるようにすることを示唆しています。もちろん。ともかく...
その変換がどのように見えるかを正確に確認したかったのですが、ILSpy でその名前の HtmlHelper の静的メソッドを調べると、メソッドは自分自身を呼び出しているように見えます。ここで何が起こっているのですか?
c# - IL命令をより高いレベルの.netコードに再構築する
ILSpy は cecil を独自のライブラリと共に使用してこれを実現しています。 ?
編集:私は今、ILSpyとcecilをバックボーンとして満足しています
解決策:
mono - アセンブリを改ざんする場合、元の指示を削除できないのはなぜですか?
SharePoint に依存するレガシ コードをテストできるようにするために、SharePoint のオブジェクトのいくつかをモックする必要があります。これを行うには、SharePoint アセンブリを改ざんし、そのメソッドをその場で自分のものに置き換えます。
これは、場合によっては機能しますが、他の場合には機能しません。私が遭遇した奇妙な状況はこれです。
SPContext.Current
のゲッターを独自の実装に置き換えたい。簡単にするために、私の実装では例外をスローするだけです。
元のアセンブリを改ざんする場合、ゲッターに対応する IL コードを置き換えるSPContext.Current
と、プロパティが使用できなくなります。これが代わりに表示されるため、ILSpy でその内容を視覚化することさえできません。
一方、元の命令の前に命令を挿入すると、getter を正常に呼び出すことができ、ILSpy でその内容を確認できます。
...挿入した指示が続きます:
...元の指示に従ってください:
新しい命令が挿入される前に元の命令が削除された場合、コードが ILSpy によって読み込まれないのはなぜですか?
ノート:
MethodDefinition.Body.Instructions
改ざんは、コレクション (および対応するInsert
andRemove
メソッド)を使用して、Mono.Cecil で行われます。アセンブリの他のいくつかのメソッドとプロパティは、
Microsoft.SharePoint
正常に改ざんされています。ILSpy は結果の IL コードを表示します。そのディレクティブが問題になる可能性があると思い
.maxstack
ました (元のプロパティで 1、プロキシされたプロパティで 8、結果で 1)。別のプロジェクトでいくつかのテストを行った後、効果がないように見えます。また、例外が原因である可能性も考えました (元のコードは新しいコードとは異なる例外をスローします)。別のプロジェクトでいくつかのテストを行った後、効果がないように見えます。
c# - c# 動的操作を逆コンパイルするときに表示される構文は、実際には何を意味していますか?
私は最近、同僚が離れている間に同僚のコードを逆コンパイルすることに苦労しなければなりませんでしたが、使用する必要のあるいくつかの場所を除いて、そのほとんどが驚くほどきれいに見えることがわかりました (ILSpy に感謝します) dynamic
。いくつかの部分にバラバラになりました:
- 呼び出しサイト コンテナー - つまり、定義上はクラスに似ていますが、
dynamic
使用されたメソッドが であるとしましょう。DoStuff
public /* static? I forget */ class <DoStuff>CallSiteContainer_Plus_Some_Weirdness { /* bunch of CallSite fields */ }
- コンテナー内のさまざまな CallSites が割り当てられているかどうかを確認し、必要に応じて使用前にそれらを割り当てる多くのコードは、実際にはまだ得られていないアプローチを使用しています。
私の質問は、最初のポイントのクラス宣言の構文に関するものです。ジェネリック クラスのように見えますが、明らかにそうではありません。そこで何が起こっているのか説明できる人はいますか?
元のコードを作成する際に助けを求めているわけではないことに注意してください。検索と置換を賢明に使用し、自動生成されたコードを他のすべてのものから切り離すことで、すでにそれを行うことができました。しかし、CallSite コンテナー構文が有効なクラス名である理由を理解したいと思います!
c# - 'using' ブロック コンパイラで生成されたコードが dotPeek または ILSpy で表示されない
using
を生成するコード ブロックのコンパイラ生成コードを調べたいと思っていますが、両方とも表示されtry-finally
ておらず、この詳細も表示されていません。私はこのコード ブロックをよく見ていましたが、ブロックが含まれていることがわかりましたが、よく理解できません。これら 2 つのツールが役立つかどうかを確認したかったのです。dotPeek
ILSpy
ildasm.exe
try-finally
何か案は?
更新:
そのため、最近、プロジェクトで IDisposable を実装した構造体を使用し、using
コード ブロックと IDisposable を含む構造体がボクシングを引き起こすかどうか心配していました...しかし、後で、コンパイラがこの状況に最適化され、最適化されないことを述べた次の記事を見つけました。 Dispose を呼び出そうとすると、ボックスが表示されます。
http://ericlippert.com/2011/03/14/to-box-or-not-to-box/
そのため、コンパイラが using ブロックに対してどのようなコードを生成するかを知りたいと思っていました。
f# - C# ショップで働いていて、変換を ILSpy に頼るためだけに F# を書こうとすると、どのようなリスクがありますか?
C# ショップで働いていて、F# で機能を記述しようとして、ILSpy を使用して F# ソース コードを C# 表現に変換しようとすると、どのようなリスクが伴いますか?
.net - ICSharpCode Decompiler を使用して、ラムダ式のネストされたクラスが構文ツリーから欠落している
どうやら ICSharpCode Decompiler は、ラムダ式の C# コンパイラによって作成された内部クラスをどうにかして逆コンパイルしません。次の例を検討してください。
場合によっては、C# のラムダ式は、ラムダの本体を含むメソッドを使用して内部クラスにコンパイルされます。たとえば、次のような C# コードです。
コンパイラは、次のような内部クラスを追加します。
(これとまったく同じではないかもしれませんが、アイデアはわかります。)
問題は、これらの内部クラスMyClass
を使用してアセンブリからプログラムで AST を構築しようとすると、ASTICSharpCode.Decompiler.Ast.AstBuilder
に含まれないことです (他のすべては問題ありません)。MyClass
の注釈の中にこれらの生成されたクラスを見ることさえできますTypeDecleration
:型の注釈は、Mono.Cecil.TypeDefinition
これらの内部クラスをそのNestedTypes
プロパティに正しくリストします(したがって、それらはアセンブリから適切にロードされましたが、構文ツリーには追加されませんでした;他の、手動で作成された内部クラスは適切に逆コンパイルされます)。
私が開いたこの ILSpy の問題も参照してください: https://github.com/icsharpcode/ILSpy/issues/686
ここで明らかな何かが欠けていますか?また、GUI を使用して ILSpy からのアセンブリを調べたところ、問題のコードは適切に逆コンパイルされています (内部クラスではなく、ラムダが再構築されています)。