問題タブ [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# - ラムダを IL のストリームとしてセカンダリ AppDomain に渡し、DynamicMethod を使用して組み立て直す
ラムダ式を IL バイトのストリームとしてセカンダリ AppDomain に渡し、DynamicMethod を使用してそこに戻して呼び出すことができるようにすることは可能ですか?
そもそもこれが正しい方法かどうかはよくわからないので、この質問をする(詳細な)理由は次のとおりです...
私のアプリケーションでは、リフレクションのためにいくつかのアセンブリをロードする必要がある場合が多いため、次にそれらをどうするかを決定できます。問題の部分は、アセンブリを検討し終わった後にアセンブリをアンロードできるようにする必要があることです。これは、別の を使用してそれらをロードする必要があることを意味しますAppDomain
。
さて、私のケースのほとんどは、完全ではないことを除いて、似たようなものです。たとえば、簡単な確認を返す必要がある場合もあれば、アセンブリからのリソース ストリームをシリアル化する必要がある場合もあり、1 回または 2 回のコールバックを行う必要がある場合もあります。
AppDomain
そのため、同じやや複雑な一時的な作成コードを何度も何度も書きMarshalByRefObject
、新しいドメインと元のドメインの間で通信するカスタム プロキシを実装することになります。
これはもはや受け入れられないため、次のAssemblyReflector
ように使用できるクラスをコーディングすることにしました。
AssemblyReflector
AppDomain
のおかげでアンロードが自動化され、別のリフレクション コードを透過的に保持するタイプのラムダIDisposable
を実行できるようになります。Func<Assembly,object>
AppDomain
問題は、ラムダを他のドメインに簡単に渡すことができないことです。そのため、検索した後、まさにそれを行う方法のように見えるものを見つけましAppDomain
た.ILストリームとしてラムダを新しいものに渡します-そして、それは元の質問に私をもたらします.
これが私が試したものですが、うまくいきませんでした(BadImageFormatException
新しいデリゲートを呼び出そうとしたときに問題がスローされていました):
私は近づいていますか(何が欠けていますか?)、それともこれは無意味な練習ですか?
注:これが機能した場合でも、参照に関してラムダに何を入れるかについて注意する必要があることを認識しています。しかし、それは問題ではありません。
更新: もう少し先に進むことができました。メソッドを再構築するには、単純に呼び出すだけでSetCode(...)
は十分ではないようです。必要なものは次のとおりです。
トリックは次のとおりです。元の IL には、元のメソッドのコンテキストでのみ有効な特定のメタデータ トークンが含まれています。IL を解析し、それらのトークンを新しいコンテキストで有効なものに置き換える必要がありました。これは、 Drew WilsonとHaibo LuoILTokenResolver
の 2 つのソースから採用した特別なクラス を使用して行いました。
これにはまだ小さな問題があります。新しい IL は正確には有効ではないようです。ラムダの正確な内容に応じて、実行時に InvalidProgramException がスローされる場合とスローされない場合があります。
簡単な例として、これは機能します:
これはしませんが:
まだ決定されていない違いに応じて、機能するかどうかのより複雑な例もあります。小さいながらも重要な詳細を見逃している可能性があります。しかし、ildasm の出力をより詳細に比較すれば、それが見つかると確信しています。発見したら、ここに投稿します。
編集:ああ、男。この質問がまだ未解決であることを完全に忘れていました。しかし、おそらくそれ自体が明らかになったので、これを解決することを断念しました。私はそれについて満足していません、それは確かです。本当に残念ですが、これを再試行する前に、フレームワークや CLR からのサポートが改善されるのを待つことにします。これを機能させるには多くのハックを行う必要があり、それでも信頼性は高くありません。興味を持ってくださった皆様、申し訳ありません。
jit - コードをMSILに直接コンパイルする
マシンでコードを実行しているときにJITをバイパスできるように、コードをMSILではなくネイティブコードに直接準拠させる方法はありますか?可能であれば。テクニックも教えてください。
ありがとう
.net - MSILでコーディングすることは可能ですか?
これができるかどうか知りたいだけです。それがいくつかの重要なパフォーマンス上の利点を詰め込まないのであれば、私はそれをするつもりはありません。私はWebおよびゲームの開発者ですが、通常、C#でゲームを開発することはありません。
.net - 難読化ツールを作ろうとしています
これは2つの部分からなる質問の一種です。しかし、それは両方とも同じことに関係しています。
アプリのILコードを使用してパッチを適用したいと思います。私は正しいアプローチは何だろうかと思っています。明らかに、私はそれを逆コンパイルし、ilコードファイルを読んで編集してから再コンパイルすることができました。しかし、ファイル内でmsilコードとして読み取る方法はありますか。リアルタイムで編集するかもしれません。
実行可能ファイルの逆コンパイルされたコードを編集しようとしていました。しかし、再コンパイルするたびに、実行に問題が発生します。もうそのエントリポイントを見つけることができなかったように。どうすればそれを計算できますか?コマンドとそのパラメータの長さを知る必要があると思います。または、エントリポイントをラベルなどにする必要があります。このようなもののためのVisualStudioテンプレートがあればいいのにと思います。
.net - PEVerify 警告パラメータの順序が正しくありません
Reflection.Emit を使用してアセンブリを作成しました。PEVerify を実行すると、同じタイプの 214 個の警告が返されます。
残念ながら、この種の問題に関するドキュメントはあまりありません。
メソッド名、引数名、クラス名、メソッド署名などに関係するメタデータ警告であるため、私は推測しています。これを私のコードに関連付ける唯一の方法は、これから試していく警告の数です。
どんな助けや洞察もいただければ幸いです。
c# - MSIL の質問 (基本)
次の C# コードがあるとしましょう。
イル:
さて、私の理解では、ldarg.# はメソッドに提供された引数をスタックに置くので、それらを操作できますか? しかし、メソッドが 1 つの引数しかとらないのに、なぜ ldarg.1 と ldarg.0 を呼び出すのでしょうか?
c# - MethodBuilder で動的 IL を生成するときに可視性チェックをスキップすることはできますか?
DynamicMethod を使用して IL を生成する場合、 DynamicMethod コンストラクターのrestrictedSkipVisibility パラメーターに「true」を指定すると、メソッドを呼び出してフィールドにアクセスすることができます。
ビルド時に生成された IL をアセンブリに保存できるように、代わりに動的アセンブリに動的 IL を発行することをお勧めします。このメソッドを使用する場合、DynamicMethod の代わりに MethodBuilder を使用する必要があります。ただし、動的コードを実行したときに MethodAccessException が発生しないように、可視性チェックをスキップできるようにする必要があります。これを行う方法はありますか?
c# - c# ILGenerator nop?
ILGenerator を使用していくつかの IL を生成しています。ここに私のコードがあります。
これにより、次の IL が生成されました。
(ILStream という名前の VS Virtulizer から IL コードを取得します)
nops はどこからコーディングしますか? それらを取り除く方法はありますか?私はいくつかの C# コードを模倣しようとしていますが、3 つの nop がありません。
.net - .net ジェネリックの正規化
ジェネリック インスタンスごとに非ジェネリック型を生成するようにコンパイラに指示した場合、アセンブリを書き換えているときに、アプリケーションのコードが大きくなるだけで、パフォーマンスは同じになるでしょうか?