問題タブ [dynamicmethod]
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# - Expression.Lambda を任意の所有者タイプにアタッチする方法は?
このテストに合格したい:
これは、スタック ウォーキングの遅延コードを正しく機能させるために必要です。それを行う最も簡単な方法は何ですか?
私は最もポータブルな方法を好みます。
c# - 動的メソッド OpCodes.Stfld により、「操作によりランタイムが不安定になる可能性があります」
.Net 3.5 プロジェクトを .Net 4.5 にアップグレードしようとしています。すべてが機能していますが、1 つの DynamicMethod が原因で「操作によりランタイムが不安定になる可能性があります」という例外が発生します。
呼び出しコード
dataProviderAdapter.GetGuid(values, index) は期待どおりに system.Guid を返しますが、fieldSetter を呼び出すと、「操作によりランタイムが不安定になる可能性があります」という例外が発生します。
私は IL の経験がないので、どこからデバッグを開始すればよいかわかりません。PEVerify はエラーを返しません。どんな助けでも大歓迎です。
c# - この、プライベートおよび保護されたアクセスを使用して、式ツリーによって動的インスタンス メソッドをコンパイルしますか?
「this」参照、プライベート、および保護されたメンバーにアクセスして、既存の型のインスタンス メソッドとして C# (または他の .NET 言語) で動的メソッドを作成することは可能ですか?
可視性の制限を回避することなく、プライベート/保護されたメンバーへの正当なアクセスは、DynamicMethod で可能になるため、私にとって非常に重要です。
Expression.Lambda CompileToMethod(MethodBuilder) 呼び出しは非常に複雑に見えますが、既存の型/モジュールに対して適切な MethodBuilder を作成する方法をまだ見つけることができませんでした
編集: 式ツリーから、静的/拡張メソッドのように、Action<DestClass, ISourceClass> のコピーを作成しました。いずれにせよ Expression.Property(...) アクセスは Reflection (PropertyInfo) によって定義され、Reflection を介して定義されている場合は、プライベート/保護されたメンバーにアクセスできます。生成されたメソッドが可視性チェックを備えたメンバーのように動作する (通常の C# コピー コードよりも少し高速である) DynamicMethod および発行された IL ほど良くはありませんが、式ツリーは維持するのにはるかに優れているようです。
このように、DynamicMethod と Reflection.Emit を使用する場合:
この動的メソッドは、完全な可視性チェックを使用して、DestClass のプライベート/保護されたメンバーにアクセスできます。
式ツリーをコンパイルするときに同等のものはありますか?
c# - アクションから DynamicMethod を作成する指示
私は DynamicMethod で遊んでいて、次のことを目指しています:
を使用して IL コードをバイトとして取得するアクションがありますGetILAsByteArray()
。このバイトから動的メソッドを作成して実行したいと思います。ここに私がやろうとしていることの例があります:
を呼び出すと、dynamicCallback.Invoke(null, new object[] { "World" })
「例外がスローされました: 'System.BadImageFormatException' in mscorlib.dll」が表示されます。
私が知らないことの1つは、 の2番目の引数として何を使用するSetCode()
必要があるか、「maxStackSize」として何を使用する必要があるかです。初期アクションと同じ値を設定するにはどうすればよいですか? しかし、これは例外の理由ではないと思います。
ILバイトから動的メソッドを適切に作成するにはどうすればよいですか?
解決
ここで、Dudi Keleti によって提供された完全なソリューションを要約したいと思います。
注: DynamicMethodHelper は Haibo Luo によって開発され、ブログ投稿で説明されているクラスですが、ここから直接ダウンロードすることもできます。
c# - DynamicMethod に他のメソッドを呼び出させる
クライアントコードに依存するイベントの名前とアクションを渡すことで、任意のオブジェクトの任意のイベントをサブスクライブできるようにしたいと考えています。次のコードがあります
上記のコードの使用法:
イベントが発生すると、InvalidProgramException が発生します。これが難しいことはわかっています。単純に += を使用してサブスクライブすることもできますが、コードがクラッシュする理由を誰か教えていただけますか? ILGenerator.Emit に何か問題があると思いますが、何か提案はありますか?
c# - C# で IL Generation を使用してオブジェクトのインスタンスを作成できないのはなぜですか?
私は次のクラスを持っています:
のインスタンスを動的に作成する次のメソッドConstructorInfo
:
次に、このメソッドを使用して、コンストラクターごとに 1 つずつ、このクラスの 2 つのインスタンスを作成します。
ただし、1をinstanceTwo
取得する代わりに、43603896を取得しています。
関連するコンストラクターでブレークポイントにヒットすると、確かに43603896がインスタンスに渡されていることが示されますが、理由がわかりません!?
c# - DynamicMethod - 共通言語ランタイムが無効なプログラムを検出しました
そこで、ilgenerator を使用して動的メソッドを介して extern DLL からメソッドを呼び出そうとします。
そしてDLLコード:
しかし、私はこの奇妙なエラーが発生しています:
タイプ 'System.InvalidProgramException' の未処理の例外が test.exe で発生しました
追加情報: 共通言語ランタイムが無効なプログラムを検出しました。
そして、私は何が間違っているのかわからない??
.net - DynamicILInfo 呼び出しメソッド
だから私は.NETでデバッグして遊んでいます。そして、dll から DynamicILInfo を使用してメソッドを呼び出そうとしています。しかし、私は何を間違っていますか?