問題タブ [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.
c# - CLRベースの言語アセンブリで特定の型のすべての型依存関係を見つけるにはどうすればよいですか?
インターフェイス、抽象クラス、列挙型、構造体など、特定の型が依存しているすべての型を見つけようとしています。アセンブリをロードし、その中で定義されているすべての型のリストを出力したいと思います。それらの依存関係。
これまでのところ、CLRアセンブリがMono.Cecilを使用して依存しているすべての外部タイプを見つけることができました。
このリストは、「monodis SomeAssembly.dll --typeref」などのモノラル逆アセンブラを使用して取得することもできますが、このリストには、System.Void、System.Int32などのプリミティブが含まれていないようです。
タイプが同じアセンブリで定義されている場合でも、各タイプを個別に処理し、特定のタイプが依存するすべてのタイプを取得する必要があります。Mono.Cecilまたは他のプロジェクトを使用してこれを行う方法はありますか?
アセンブリをロードし、定義された各タイプを反復処理し、タイプのILをロードして参照をスキャンすることで実行できることはわかっていますが、もっと良い方法があると確信しています。理想的には、匿名の内部クラスでも機能します。
同じアセンブリで複数のモジュールが定義されている場合にも機能するはずです。
c# - Silverlight 3.0 C# - Methodbuilder を使用して SET メソッドを作成し、ILGenerator と Emit を使用して MSIL を追加する
ヘジ・オール
新しい TYPE ランタイムを構築するコードがいくつかあります。それは MethodBuilder を使用して GET および SET メソッドを設定します。(これはウェブからの例であり、それを書いたガイのおかげで、残念ながら彼への参照を失いましたが、彼は私の考えの中にあります)
この方法でクラスにメソッドを追加します。
それは正常に動作しますが、setmethod をより複雑なものに変更したいので、このテスト コードを記述します。
public class Customer { プライベート文字列 _name; パブリック文字列名 { get { return _name; } set { if ( string.IsNullOrEmpty( value ) ) { throw new ValidationException("値を設定してください"); } _name = 値; } } パブリック文字列の姓 { get; 設定; } }
コンパイルし、Reflector を使用して MSIL を取得します。
したがって、タスクはそれを SET EMIT コードに実装することです。
これは、私が不足しているところです、私はそれを働かせることができません。コードを「ただ」コピーすることはできず、MSIL のスキルは限られています。以下は私のエラーです。
3行目で、これらの赤い下線はエラーを示しています...
- Bool = ") 期待される"
- [mscorlib]システム = "; 期待"
- :: = "。期待"
- そして最後の ) は「無効な式用語文字列」を与える
リフレクターを使用できないのはなぜでしょうか。コードは問題ないはずですか? また?
EMITステートメントで使用できるMSILコードを表示するプログラム/メソッドを見つけることが解決策です。
これは単なる例であるため、コードは変更されるため、正しいコードに回答するための解決策ではありません (例を機能させることは素晴らしいことです) が、C# から正しい MSIL を取得するためのより恒久的な "方法" です。
Peww、長い質問です。ここにすべてが揃っていることを願っています。
よろしくリロード
cil - .NETおよび出力ファイル拡張子
Visual StudioがMSIL形式の場合、アプリケーションを実行可能ファイルにコンパイルするのはなぜですか?コードを.classファイルにコンパイルするのはJavaのようなものではありませんか?
c# - C#: MSIL を記述してプリプロセッサ ディレクティブを追加する
#warning
C#で、特定の条件が満たされた場合など、コードにプリプロセッサ ディレクティブを追加する MSIL コードを作成することは可能ですか? または、これはリフレクションで実行できるかもしれませんが、わかりません。
クラスのメソッドまたはプロパティに正しく適用されない場合、コンパイラの警告を生成するカスタム属性を作成しようとしています。カスタム属性を使用するだけで警告が発生するため、既存のObsolete
属性を使用しても機能しません。これは望ましくありません。カスタム属性コンストラクターで条件をチェックし、その条件が true の場合はコンパイル警告が発生するようにします。
更新: 私の質問を読み返した後、コンパイル時と実行時の制約を混在させているという理由だけで、私が求めていることは不可能だと思います。ビルド後のタスクを実行して、ビルドしたばかりの DLL をチェックし、条件が true の場合にエラー メッセージを出力させることになると思います。
c# - C# コンパイラは不要なキャストを最適化しません
数日前、オーバーフローに関するこの質問への回答を書いているときに、C# コンパイラが期待どおりの動作をしていないことに少し驚きました。コード スニペットについては、次を参照してください。
初め:
2番:
2 つのスニペットのコードの唯一の違いは、へのキャストICollection<object>
です。object[]
はインターフェイスを明示的に実装しているためICollection<object>
、2 つのスニペットが同じ IL にコンパイルされ、したがって同一になると予想していました。しかし、それらでパフォーマンス テストを実行すると、後者が前者の約 6 倍高速であることがわかりました。
castclass
両方のスニペットの IL を比較した後、最初のスニペットの IL 命令を除いて、両方のメソッドが同一であることに気付きました。
これに驚いて、なぜ C# コンパイラがここで「スマート」でないのか疑問に思います。物事は見かけほど単純ではないのに、なぜ C# コンパイラはここで少しナイーブなのでしょうか?
c# - 独自のクラスのインスタンスで DynamicMethod を呼び出すと、なぜ例外が発生するのですか?
で実行時に独自の関数を作成して CIL を学習していますReflection.Emit
。今までのやり方がいかに簡単だったかには実際に驚いていますが、自分のやり方を推測できない何かにぶつかり、ドキュメントに関連するものは何も見つかりません。
定義した非常に単純なクラスを単純に出力する関数を作成しようとしています。たとえば、コードを print string
s に変更すると動作しますが、 class のインスタンスを渡すと常に実行に失敗しますA
。
奇妙なのは、関数本体をコメントアウトできることTargetInvocationException
です。それは非常に単純でなければなりませんが、何が起きているのかわかりません!
これを例外として発生させるには、何が間違っているのでしょうか? これが私のクラスでのみ発生するのはなぜですか?
c# - callvirt を使用して base.ToString() を呼び出すと、StackOverflow 例外が発生する可能性がありますか?
IL は、関数を呼び出すための 2 つのステートメント、つまり call と callvirt を提供します。Call は、非仮想関数または静的関数、またはコンパイラが参照に対して null チェックを実行したくない関数を呼び出すために使用されます。
callvirt は仮想関数を呼び出すために使用されます。コンパイラは実行時に参照に対して null チェックを行うため、非仮想関数も呼び出されます。
C#経由でCLRを調べているときに、次の例が見つかりました。
現在、ToString() は仮想関数ですが、コンパイラはそれに対する呼び出し命令を生成しますが、Jeffrey が callvirt が生成されない理由について言及した理由は、その場合、ToString() が再帰的に呼び出され、StackOverFlow 例外が発生するためです。私は理解しようとしましたが、この考えを理解することができませんでした? 再帰呼び出しが発生する理由を誰か説明できますか?
ありがとう..
.net - CLR プロファイリング API を使用して IL を書き換えるには、独自のアンマネージ IL ライブラリを作成する必要がありますか?
私は CLR プロファイリング API に関するいくつかの記事を見てきましたが、それらの記事の多くは SetILFunctionBody() を呼び出して実際の IL 書き換えを行うことについて述べています。ただし、実際のメソッド IL バイトを書き換えるために何を使用できるかを正確に説明している記事はありません。IL を作成できる管理されていないライブラリはありますか、それとも自分で作成する必要がありますか?
c# - コードの盗難を防ぐにはどうすればよいですか?
.NET exe を起動すると、正確には何が起こりますか? C# が IL コードにコンパイルされていることは知っています。生成された exe ファイルは、ランタイムを開始して IL コードを渡す単なるランチャーだと思います。しかし、どのように?そして、それはどれほど複雑なプロセスですか?
ILコードはexeに埋め込まれています。通常のexeはそうではありませんが、ディスクに書き込むことなくメモリから実行できると思います(はい、非常に複雑です)。
私の最終的な目的は、IL コードを抽出し、独自の暗号化されたランチャーを作成して、scriptkiddies が Reflector で私のコードを開いて、すべてのクラスを簡単に盗むのを防ぐことです。リバース エンジニアリングを完全に防ぐことはできません。彼らがメモリを検査し、純粋な IL をランタイムに渡す瞬間を捉えることができれば、それが .net exe であるかどうかは関係ありませんね。いくつかの難読化ツールがあることは知っていますが、IL コード自体を台無しにしたくありません。
編集:私が望んでいたことを試す価値はないようです。いずれにせよクラックされるだろう...だから私は難読化ツールを探すことにする。はい、私の友人も、すべてのシンボルの名前を意味のない名前に変更するだけで十分だと言いました。結局のところ、リバース エンジニアリングはそれほど簡単ではありません。
c# - DynamicMethod NullReferenceException
ここで私のILコードの何が問題なのか誰か教えてもらえますか?
上記と同じことを行うテストアプリをC#で書いたので、ここで夢中になります.上記の列挙型のプライベート値フィールドの代わりにパブリック フィールドを持つ TestStruct ですが、skipVisibility を true に設定しています)...
NullReferenceException が発生します。
私の DynamicMethod の署名は次のとおりです。
次のようなメソッドを生成します。
そして、私は絶対にnullを渡していません。
前もって感謝します!