問題タブ [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# - C# は、この単純なイベント ハンドラーを動的に生成できません
イベントハンドラーの動的生成について少し学習しようとしていますが、この単純な状況を再現するのに苦労しています:
リフレクターを使用して DoSomething メソッドの IL を生成すると、次のようになります。
そこで、DoSomething(...) と同等のメソッドを動的に生成して実行する次のコードを作成しました。
ただし、これを実行すると、InvalidProgramException が発生します。JIT コンパイラで内部制限が発生しました。
誰かが私が間違っている場所を指摘できますか?
[編集] 何人かがコメントしているように、関連するすべてのタイプを知っていれば、IL 生成全体は不要です。これを行う理由は、これが、関連するすべてのタイプがわからないイベントに対して、実行時にイベント ハンドラーを動的に生成するための最初のステップだからです。基本的に、私はhttp://msdn.microsoft.com/en-us/library/ms228976.aspxの例に従っていましたが、動けなくなってから、作業を開始できる単純な例に巻き戻そうとしました。
c# - 動的 IL メソッドにより、「操作によりランタイムが不安定になる可能性があります」
System.Security.VerificationException: 操作により、ランタイムが不安定になる可能性があります。Connance.CommunicatorApi.ReportApiClient.AcknowledgeRecallsAsyncDynamicHandler (オブジェクト、AcknowledgeRecallsCompletedEventArgs) で
それが私が得ているエラーです。私がやろうとしていること (背景) は、メソッドのクラスのグローバル イベント ハンドラーを作成することです。私は WCF で静的プロキシを使用しています。すべての呼び出しを追跡し、すべての WCF Web メソッドに戻るレイヤーを作成する必要があります。残念ながら、WCF は "Completed" イベントの EventArgs を厳密に型指定するため、ほとんど不可能です。
私は何かを試してみることにしました。イベントが の場合でも、イベントを処理するEventHandler<SomeSpecificEventArgs>
署名の方法を登録できます。void Method(object, object)
偉大な。そこで、グローバルハンドラDynamicMethod
を呼び出すを作成し、それを各イベントに登録することにしました。
私は2つの方法を試しました:
1) DynamicMethod は void (オブジェクト、オブジェクト) 型です
2) 型 void (object, SomeSpecificEventArgs) -- 汎用メソッドを使用して型を取得します。
手動またはイベントのためにメソッドを呼び出そうとすると、上記の例外が発生します。
これが私のコードです:
編集:なるほど。別の問題があることがわかりました。私はシルバーライトで作業しています。別のプロジェクトでシナリオを再現するDynamicMethod
ことができ、所有者を設定できるオーバーロードを使用して動作させました。次に指定します
DynamicMethod dm = new DynamicMethod("TestMethod2", typeof(void), new[] { typeof(MyClass), typeof(string), typeof(string) }, typeof(MyClass));
、
ldarg.0
、ldarg.1
、および を使用しldarg.2
ます。ただし、これはセキュリティ クリティカルなコンストラクターであり、Silverlight では実行されません。その場合、どのように設定する必要があるのか わかりません。public を staticにして、Handler
args を 0 ~ 1 にロードしますか? 次のようなエラーが発生します。
メソッド「DynamicClass.TestMethod2(System.String, System.String)」によるメソッド「dynamicass.MyClass.Handler(System.String, System.String)」へのアクセスに失敗しました。"}
c# - DLR式の「データとしてのコード」はどこにありますか?
私はこのc#コードを持っています:
これを DLR 式で行う場合は、次のようになります。
この例は、本 Pro DLR in .NET 4 から引用しました。なぜこの余分な作業を行っているのか理解できません。Book によると、コードがメモリ内のオブジェクトとして表現されると、IL 命令よりもはるかに簡単に分析できるからです。
最も混乱するのは、コードに ConsoleWriteline() メソッドの代わりに DLR 式を配置してコンソール アプリケーションを実行すると、同じ .exe ファイル (CIL コードを含む) が取得され、"Hello world" が記述されたファイルが表示されることです。 .exe ファイルが実行された結果としてのコンソール。どちらの場合も、実行される .exe ファイル (cil コード) を取得しますが、実行時にコードをデータとして表すオブジェクトがどこにあり、どのようにアクセスすればよいかわかりません。
.net - モジュール初期化子はSilverlightおよびWindowsPhone7でサポートされていますか?
ILを操作する意思がある場合、.netはモジュールイニシャライザーをサポートします
http://blogs.msdn.com/b/junfeng/archive/2005/11/19/494914.aspx
http://tech.einaregilsson.com/2009/12/16/module-initializers-in-csharp/
モジュール初期化子はSilverlightおよびWindowsPhone7でサポートされていますか?
c# - 構造体のメソッドを呼び出すときの CLR のしくみ
クラスの答えはわかっていると思いますが、自分の理解が正しいことを確認したいだけです。ClassA
という名前の とそのインスタンスがあるとしますa
。a.MethodA()
が呼び出されるとき:
(1) CLRClassA
の型ポインターからa
ヒープ内の型を見つける (型はヒープに読み込まれている)
(2)MethodA
型を検索し、見つからない場合は、その基本型に移動し、object
クラスまで。
私の理解は正確ではないかもしれませんが、基本的には正しいと思います (間違っていたら訂正してください!)。ここで、単純なstructの問題が発生します。
がありvar x = new MyStruct();
、その値はスタックにあり、の型はMyStruct
ヒープにロードされています。executex.MethodA()
の場合、もちろんボクシングはありません。CLR はどのようMethodA
に IL を見つけて取得し、それを実行/JIT しますか? 答えはおそらく次のようになると思います:(繰り返しますが、間違っていたら訂正してください)
(1) スタック上に の宣言型がx
あります。CLR は、スタック上の情報からその型を見つけMethodA
、その型を見つけます。-- と呼びましょうassumptionA
。
私assumptionA
が正しいと言っていただければ幸いです。しかし、それが間違っていても、それは真実を語っています。CLR には、ボクシングせずに構造体の型を見つける方法があります。
では、x.ToString()
またははx.GetType()
どうでしょうか。値がボックス化され、クラスのように機能することがわかっています。しかし、なぜここでボクシングが必要なのでしょうか? その型を取得できるので(仮定Aが教えてくれます)、その基本型に移動して(クラスのように)メソッドを見つけてみませんか?なぜここで高価なボックス操作が必要なのですか?
c# - MSILで[opt]はどういう意味ですか?
C#4.0の「オプションのパラメーター」機能は非常に興味深いものであることがわかったので、それらがどのように実現したかを理解しようとしました。だから私はこのようなメソッドを書きました:
コンパイルしてからILDASMで逆コンパイルします。これは、ILコードです。
そして、メタデータにこれが含まれています。
(1)ParamToken:(08000002)名前:フラグ:[オプション] [HasDefault](00001010)デフォルト:(I4)5
そこで私は手がかりに従い、次のようなメソッドを作成しました。
それをコンパイルして逆コンパイルしたところ、C#コンパイラーがメソッドAとB(名前を除く)に対してほぼ同じMSILコードを生成していることがわかりました。
ご覧のとおり、ILコードには属性の兆候がなく、間違っていると感じたため、次のようなカスタム属性を作成しました。
次に、次のようにメソッドCで使用しました。
それをコンパイルしてから逆コンパイルしました、そしてハァッ、私はこれを見つけました:
メソッド本体の2行目は、カスタム属性のctorを呼び出します。
だからこれは私の疑問につながります:
- [opt]はどういう意味ですか?メソッドAとBのパラメータの前に表示されるものを意味します。
- メソッドCがそのパラメーターに適用される属性のコンストラクターを呼び出すのに、メソッドAとBは呼び出さないのはなぜですか?
- メタデータにDefaultParameterValueAttributeの兆候が見つからないようですが、OptionalAttributeとMyTestAttributeは見つかります。何故ですか?足りないものはありますか?
前もって感謝します。
.net - カスタム属性が IL とメタデータの両方に表示されるのはなぜですか?
次のような 2 つの属性があります。
それらは非常に単純で、何もしません。
そして、これら 2 つの属性で装飾されたメソッドがあります。
コードをコンパイルして IL Dasm で逆コンパイルすると、メソッド「Hello」の IL コードは次のようになります。
Test1Attribute と Test2Attribute の両方が IL コードにあることがわかります。そのメタデータは次のようになります。
ここでも、両方の属性がメタデータに存在します。
だから私は興味があります:
- IL とメタデータの両方に表示されるのはなぜですか?
何が
.param [1] .custom インスタンス void ConsoleApplication1.Test1Attribute::.ctor() .param [2] .custom インスタンス void ConsoleApplication1.Test2Attribute::.ctor()
平均?指導のようには見えません。それで、彼らは何ですか?彼らは何をしますか?
ありがとう
serialization - ロードされたアセンブリからクラス IL コードを抽出してディスクに保存する方法は?
実行時にリフレクションによって生成されるクラスの IL コードを抽出して、ディスクに保存するにはどうすればよいですか? できれば。これらのクラスを生成するコードを制御することはできません。
最終的に、この IL コードをディスクから別のアセンブリにロードしたいと考えています。
クラスをシリアライズ/デシリアライズできることはわかっていますが、純粋に IL コードを使用したいと考えています。私はセキュリティへの影響については気にしていません。
Mono 2.10.1 の実行
.net - プログラマーがコードを書くための第一言語としてILを使用するシナリオはありますか?
ほとんどの開発者は、コア.NET言語(c#、vb.net、c ++ / cliなど)の1つを使用して、アプリケーション/開発者を作成します。プログラマーとしての日々の仕事の第一言語として中間言語(IL)を使用する人がいるかどうか疑問に思っていました。
c# - C# 'is' 演算子は、.NET 4 のリリース モードの最適化で影響を受けますか?
以下は簡単なテストフィクスチャです。デバッグ ビルドでは成功し、リリース ビルドでは失敗します (VS2010、.NET4 ソリューション、x64):
コードの最適化が大混乱を引き起こしているようです。リリース ビルドで無効にすると、同様に機能します。それは私にとってかなり不可解でした。以下では、ILDASM を使用してビルドの 2 つのバージョンを逆アセンブルしました。
IL をデバッグします。
リリース IL:
ストアとロードが最適化されているようです。以前のバージョンの .NET フレームワークをターゲットにすることで問題は解決しましたが、それはまぐれかもしれません。私はこの動作がやや不安であることがわかりました.コンパイラが、異なる観察可能な動作を生成する最適化を行うことが安全であると考える理由を誰か説明できますか?
前もって感謝します。