問題タブ [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# - 実行時に IL コードを C# に変換する
実行時に IL コードを C# に変換できる無料のライブラリはありますか?
ありがとう、クリスチャン
編集
これが私が持っているものの例です:
私のプログラムでは、ある時点で、アセンブリにあるクラスの IL コードに似た文字列のリストがあります。
この文字列の配列 (各文字列は 1 行) を取得したので、対応する C# コードを何らかの方法で生成したいと思います。
これがILSpyで可能かどうか知っている人はいますか?
.net - Reflection.EmitILの以下のコードと同等のものは何ですか
私は以下を持っています
しかし、それは機能していないようです
コード、私は本当に生成したい:
ここに次のコードがあります:http://pservicebusext.codeplex.com/SourceControl/changeset/view/4f8a4f1190ae#PServiceBus.RemoteProxy%2fPServiceBus.RemoteProxy%2fESBProxy.cs
上記のコードを生成することを想定したCreateProxy()というメソッドがあります。ただし、パーツがループして、メソッドのgetとsetが正しく機能していません。リクエストオブジェクトの値を設定することはなく、常にnullのままになります
問題を解決し、OpCodes.Ldarg_0からOpCodes.Ldarg_1に変更しました
c# - Br_S OpCode を使用して、Reflection.Emit.Label を使用して次の命令を指す
メソッドを発行するために IL の解析を試しています。各文字列が IL 命令である string[] 内のメソッドの IL コードを取得しました。この配列をループして、ILGenerator を使用して OpCode を追加しています。
再現する必要がある IL は次のとおりです。
そして、ここに私が出力として得ているものがあります:
ご覧のとおり、br.s 呼び出しはそれ自体を指しているため、もちろん無限ループが発生します。ソースのように次の命令を指すようにするにはどうすればよいですか? これは Reflection.Emit.Label の使用に関係していますが、どのように機能するかはわかりません。
編集ちなみに、上記のILはこの単純な方法のためのものであり、
.net - 匿名メソッド用のILの生成
マルチスレッドアプリケーションのILを生成したい。最初のステップとして、私は簡単なアプリケーションを作成し、ILSpyを使用してILを検査および生成しました。
System.Reflection.Emit名前空間を使用して、上記のILコードのほとんどを生成できました。
残念ながら、System.Reflection.Emitを使用して次のILコードを生成する方法を理解できませんでした。
それで、誰かが匿名メソッドのILを生成する方法を理解するのを手伝ってくれるでしょうか?
c# - ILEmitTypeBuilderと解決参照
私はいくつかのクラスを発行していますが、そのうちのいくつかは独自のコンストラクターでピアを構築する必要があります。無限の再帰的な依存関係はありません(したがって、AがBを構築する場合、BはAを構築しません。これは、ネストされた参照にも当てはまります[AがBを構築するCは、BもCもAを構築しないことを意味します])。私は現在、コンストラクターを発行するコードに取り組んでいますが、少し問題があります。依存関係の順序が事前にわからないため、いくつかのオプションがあるようです。
- どういうわけか、クラスを依存関係で並べ替え、依存関係の順序でクラスを「構築」するので、依存度の高いクラスには、取得するための有効なコンストラクター参照があります。
- すべてのコンストラクター参照が定義されるように、最初のパスで(実際にメソッドのILを発行せずに)すべてのコンストラクターを個別に定義します。
- どういうわけか、定義されたコンストラクターをキャッシュして、コンストラクターがまだ定義されていない場合は、プレースホルダーConstructorBuilderを作成して参照を取得できます。この参照は、後でコンストラクターが最終的に発行されたときに取得されます。
私は現在オプション(3)を試していますが、TypeBuilderからこれを行う方法がすでにあるかどうか疑問に思いました。私は次のようなコードを持っています(必要なときにコンストラクター参照を取得するため):
そして、私のBuildメソッドは現在このように開始されます(コンストラクターが以前に定義されている場合、これは機能しないと思います):
独自の明示的なキャッシュを作成せずに、以前に定義された(定義されている場合)ConstructorBuilderを検索できる方法はありますか?TypeBuilderはそれを知っているはずのようですが、TypeBuilderのドキュメントからそれを調べる明確な方法がわかりません。
編集:
私は最終的にルート(2)をたどりました。これは、最初のパスで関連するすべてのメソッドを定義し、その後2番目のパスでILを放出します。他の場所ですでに定義されているビルダーのTypeBuilderからMethodBuilderインスタンス(またはConstructorBuilderインスタンス)を取得できるかどうかは、まだ興味があります。
c# - refキーワードを使用せずに(ILを使用して)パラメーターのrefを置き換えます
refキーワードを使用せずに、パラメーターのオブジェクト参照を置き換えることができるようにしたいと考えています。
refの使用を避けている理由は、メソッドを探すコレクション初期化子の呼び出しを保持するAdd(T item)
ためであり、コレクションクラスで参照をそのインターフェイスの別の実装に置き換える必要があります。
私はこれを行うためにいくつかの異なる方法を試しました。まず、文書化されていないキーワード、、を使用してみ__makeref
まし__refvalue
た__reftype
。
次にDynamicMethod
、refパラメーターを使用して逆アセンブルされた同様の呼び出しを調べて観察したものを模倣しようとするILを使用してを作成しようとしました。
示すコードは次のとおりです。
ありがとうございました。
c# - IL、デフォルトのコンストラクター呼び出しを発行する
実行時に新しい型を生成しています。デフォルトのコンストラクターを生成した後、パラメーターを使用して別のコンストラクターを生成したいと思います。次のようにしています。
問題は、メソッド GenConstructorWithParameters からデフォルトのコンストラクターを呼び出すことができないことです。これは、CLR では次のような記述が許可されていないためです。
デフォルトコンストラクタへの呼び出しを発行するにはどうすればよいですか? それはまったく可能ですか?
tb - のインスタンスTypeBuilder
、cb -ConstructorBuilder
.net - 必要なMethodInfoとインスタンスタイプが手元にある場合、OpCodes.ConstrainedwithOpCodes.Callvirtを発行する方法
関数に対してグローバルであり、大文字と小文字を区別して型チェックされた解析済み言語を表す判別ユニオンであり、式の型を表すプロパティである再帰関数emit : Map<string,LocalBuilder> -> exp -> unit
があります。il : ILGenerator
exp
InstanceCall of exp * MethodInfo * exp list * Type
Type
exp
次のフラグメントでは、インスタンス呼び出しに対してILオペコードを発行しようとしています。インスタンス呼び出しはである場合とそうでinstance.Type
ない場合がありますValueType
。OpCodes.Constrained
したがって、参照、値、および列挙型に対して柔軟かつ効率的に仮想呼び出しを行うために使用できることを理解しています。私はReflection.Emitと機械語全般に慣れていないので、のリンクされたドキュメントを理解することはOpCodes.Constrained
私にとって強くありません。
これが私の試みですがVerificationException
、「操作によってランタイムが不安定になる可能性があります。」という結果になります。
ドキュメントを見ると、キーは「マネージポインタptrがスタックにプッシュされます。ptrのタイプはthisTypeへのマネージポインタ(&)である必要があります。これはプレフィックスなしの場合とは異なることに注意してください。 thisTypeの参照を期待するcallvirt命令。」
アップデート
@Tomasと@descoに感謝します。これで、いつ使用するかがわかりましたOpCodes.Constrained
(instance.Type
はValueTypeですmethodInfo.DeclaringType
が、参照型です)。
しかし、まだそのケースを考慮する必要はないことがわかりました。私の本当の問題は、スタック上のインスタンス引数でした。値ではなくアドレスが必要であることを知るのに6時間しかかかりませんでした(DLRソースを見てください)。コードから手がかりが得られ、単純なC#プログラムでilasm.exeを使用すると明らかになりました)。
これが私の最終的な作業バージョンです:
.net - .NET アセンブリの型の名前を [スペース] に変更するにはどうすればよいですか
何らかの型を含むアセンブリが与えられた場合、その型の名前を変更したり名前を変更したりして、その型を別の場所に配置するにはどうすればよいでしょうか? または、型を抽出して別のアセンブリに移動するだけかもしれません。
これを行うためのツールはありますか?(セシル?)そして、そのツールのちょっとしたことはありますか?
ありがとう
「なんでそんなことするのよ、バカ!?」を払拭する背景 反応:
Web アプリケーションでビューをプリコンパイルしてから、アセンブリを ILMerging しています。カスタム仮想パス プロバイダーを使用して、多くの物理的および仮想的な場所 (コンパイル済みのものとそうでないもの) からビューを読み込みます。プリコンパイルされたビューの名前と名前空間が「正しくない」ため、これを修正する必要があります。aspnet_compiler
(そもそも名前と名前空間を台無しにしない方法がない限り? また、VPP が変更された名前空間でビューを検索できることはわかっていますが、それは重要ではありません。
.net - 単純なポップとロードバックが機能しない
を返す関数を呼び出した後、object
スタック上の値をローカル変数に格納してからプッシュバックしようとしましたが、例外で失敗しました
呼び出しのターゲットで例外がスローされました
コードは次のとおりです。
削除Stloc_3
してLdloc_3
すべてが正常に機能すると、ここで迷子になります。