問題タブ [dnlib]
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# - 作成したばかりのメソッドを呼び出す。最大スタック値の計算エラー
そのため、最近DNLIBをいじっていて、.netファイルにメソッドを追加しようとしていました. 以前にコンパイルしたファイルからメソッドを取得したので、基本的にはメソッドを模倣しようとしていました。
GetTheTypes、InvokeIt、および InvokeCall の 3 つのメソッドがあります。
InvokeCall は GetTheTypes メソッドと InvokeIt メソッドの両方を呼び出すため、最初にメソッド GetTheTypes と InvokeIt を作成する必要がありました。だから私はそれらのメソッドを追加しました、そしてそれらは完全に追加されました。コンパイルして保存したところ、リフレクター/ILSpy で問題なく表示できました。注: メソッドを追加するとき、それらが静的か非静的かを確認するチェックがあるので、それは問題ではありません。それらはすべて public メソッドでもあります。
次に、InvokeCall メソッドを追加したいと思いました。そこで、他のメソッドに対して行ったのと同じことを行い、ILSpy で模倣したいメソッドを開き、基本的にすべての命令とローカル変数を新しい CilBody にコピーしました。これは、模倣していた InvokeCall メソッドに追加されました。唯一の問題は、「最大スタック値の計算エラー」というエラーがスローされたことです。奇妙なことに、OPCode を Call から NewObj に変更すると、正常にコンパイルされました。しかし、それは私がやりたいことではありません。私がやりたいことは、上記のエラーをスローします。
命令を追加するために使用するコードは次のとおりです。
_getThetypesMethod変数はMethodDefUserとして定義されており、以前に作成して問題なくコンパイルしたメソッドで構成されています。私もこれを試しました:
それもうまくいきませんでした。メソッドの DeclaringType も取得しようとしましたが、次のようにメソッドを見つけました。
それもうまくいきませんでした。
したがって、作成したばかりのメソッドを呼び出す方法について何か提案があれば教えてください。私はこの問題を解決する方法を最後の日かそこらで見つけようとしてきましたが、うまくいきませんでした。ありがとう。
c# - dnlib を使用して .NET CLR ヒープの文字列を書き換える
.NET ファイルの #US ヒープの文字列を書き換える必要があります。.NET ファイルを操作するための強力なライブラリのように見えるdnlibを使用することにしました。残念ながら、それは十分に文書化されていません。
通常の方法でファイルをロードします。メソッドは、ファイルをロードする唯一のModuleDefMD
Load()
方法のようです:
現在、dnlib にはWriter
、.NET 構造への書き込みに使用する必要があることを示唆する名前空間があります。有望に見えるUSHeap
クラスが含まれています。
ライターは、作業できるメタデータを作成する必要があるようです。
USHeap クラスには、「ヒープに書き込む値をオーバーライドする」という説明のSetRawData()
メソッドがあります。残りは不明ですが、とにかくそれを使用して、生の任意の 3 バイトを書き込みましょう。CLI 標準によると、最初の有効なオフセットは 1 です。
dnlib 例は、ファイルの書き込み方法を示しています。
このコードは、エラーなしでコンパイルおよび実行されます。残念ながら、新しいファイルには元のファイルと同じ #US ストリーム コンテンツが含まれています。
Writer がどのように機能するのか、私にはわからなかったようです。dnlib は非常に多くのソース ファイルと行で構成されているため、ソースを調べるのは簡単ではありません。
dnlib のドキュメントでは、ConfuserEx ( dnlibを使用してファイルを操作する難読化ツール) について言及しています。しかし、そのソースを見ると、#US ヒープをまったく操作していないようです。
c# - dnlib でクラスのジェネリック型を取得するにはどうすればよいですか?
私は次のクラスを持っています:
dnlibを使用して、cil コード レベルでいくつかの変更を行います。メソッド内で、パラメーターgetItem()
のクラス型を取得したい.this
ldarg.0
私はparam.Typeを探しています
利用可能なすべてのフィールドを検索しましたが、見つかりませんでした。実際、私が得るのは
そして、私は見つけることを期待しています
が欠落している理由がわかりません<!T>
。
フィールドprivate T[] array;
の場合、クラスは正しく表示さ<!T>
れ、最後に があります。
c# - tiny と fat .NET メソッド ヘッダーのチェック
.NET モジュール内のすべてのメソッドを列挙し、小さなヘッダーまたは太いヘッダーがあるかどうかを確認する必要があります。強力なdnlib .NET モジュール処理ライブラリを使用することにしました。
dnlib.DotNet.Writer.MethodBody
tiny/fat メソッド ヘッダーを示すクラスがあります (IsTiny()
およびを参照IsFat()
)。ただし、このクラスにアクセスする方法がわかりません。
クラスは Writer 名前空間にあります - Writer Listener を使用しましょう:
すべてのメソッドを列挙して、名前空間にある他の を取得するのは簡単であることに注意してください。MethodBody
Emit
残念ながら、このクラスは有用なものを明らかにしていません。次の擬似コードに似たものが機能するはずです。
.net - dnlib を使用して既存の List(Of String) に項目を追加するには?
質問で述べたように、 dnlibを使用して (文字列型の) 項目を List(Of String) に追加する方法は?
これまでのところ、これは私の進歩です:
c# - アセンブリ MethodBody を読み取り、その Name を ListBox で解析し、その IL を TextBox で解析しますか?
次のようなaと aを持つ WPFMainWindow
フォームがあります。ListBox
TextBox
Load Assembly...
OnClickボタン イベントにより、.NET アセンブリを選択し、DnLib を使用してロードできるようになりました。
次に、メソッド本体を表示したい場合は、次のようにします。
ListBox
これにより、見つかった各メソッド名が左側に追加され、次のようになります。
ここで、トリックの部分として、 から選択したメソッドに対してListBox
、それぞれの MethodBody IL をTextBox
どうすればそのようなことを達成できますか?