問題タブ [dynamic-invoke]
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# - このジェネリックコードでDelegate.DynamicInvokeを回避できますか?
この質問の一部はデリゲートに関するものであり、一部はジェネリックに関するものです。
簡略化されたコードを考えると:
SOの他の場所で、デリゲートを直接(括弧付きで)呼び出す方が、呼び出すよりも桁違いに速いことを読みましたDynamicInvoke
。これは理にかなっています。
上記のコードサンプルでは、型チェックを実行して、どういうわけかパフォーマンスを向上させることができるかどうか疑問に思っています。
いくつかのコンテキスト:さまざまなハンドラーにファームアウトされるオブジェクトのストリームがあり、それらのハンドラーは実行時に登録/登録解除できます。上記のパターンは私の目的には完全に機能しますが、可能であればよりスッキリさせたいと思います。
1つのオプションは、に格納Action<object>
し、デリゲートを別のデリゲートでDictionary
ラップすることです。Action<T>
この2回目の間接呼び出しが影響するパフォーマンスの変化はまだ比較していません。
c# - C# からアンマネージ VB COM dll を動的に呼び出す際に問題がありますか?
C# からアンマネージ VB COM dll を呼び出す際に問題があります。これは、loadLibrary と GetProcAddress を使用した動的呼び出しです。
loadLibrary を使用して dll を正常にロードできますが、 GetProcAddress は常に 0 を返します。エラー メッセージは記録されず、何も記録されませんでした。0 を返すだけです。
サンプルコードの下
VBコム
c# コード
そして呼び出しコード
誰かが私を助けることができます..
アップデート:
コンポーネントが登録されていれば、メソッドを正常に呼び出すことができます。以下のコードを使用して
dllが登録されていない場合、方法はありますか?
c# - C#で動的な暗黙の型キャストを行う方法はありますか?
暗黙のキャスト演算子を使用してこのクラスを指定すると、次のようになります。
次のことができるようになりました。
ただし、次のことはできません。
これにより、コンパイル時間が得られます。
タイプ 'object' を 'MyDateTime' に暗黙的に変換することはできません。
私には理にかなっています。
ここで、前の例を次のように変更します。
これはうまくコンパイルされます。今、私はランタイムを取得しますInvalidCastException
:
'System.Int64' 型のオブジェクトを MyDateTime 型にキャストできません。
これは、C# の暗黙的なキャスト演算子がコンパイル時にのみ適用され、.NET ランタイムがオブジェクトを別の型に動的にキャストしようとしているときには適用されないことを示しています。
私の質問:
- 私は正しいですか?
- これを行う他の方法はありますか?
ところで、完全なアプリケーションはDelegate.DynamicInvoke()
、パラメーターを受け取る関数を呼び出すために使用しているMyDateTime
もので、渡す引数の型はDynamicInvoke
long です。
java - 動的に呼び出されるメソッドの呼び出し階層の生成
今日の動的呼び出し、リフレクション、ランタイムインジェクションの世界は、ctags、doxygen、CDOCなどの従来のツールではうまく機能しません。
静的メソッド呼び出しと動的メソッド呼び出しの両方を表示できるメソッド呼び出し階層視覚化ツールを探しています。使いやすく、実行中に軽量で、記録されたランタイムセッションに関する役立つ詳細情報を提供する必要があります。
さて、 CallgrindはファミリーCの有効なソリューションと見なすことができると思います。
JVMベースのバイトコードの静的メソッド呼び出しと動的メソッド呼び出しの両方のコールグラフを作成するために、どのツール/手法を提案できますか?意図した最終結果は、main()から呼び出された各メソッドへのパスを示すことができるグラフィカル表示(できればインタラクティブ)です。
この投稿の調査中にjavashotに出くわしましたが、これは私が目指している種類のアプローチのようです。これを、IDE内から使用できるプロファイラーなどに統合することをお勧めします( Eclipse、IntelliJ、Netbeansなど)。
ありがとう、マキシム。
c# - コールバック関数: C# winform アプリから参照先の VC++ Exe にコールバックを渡す
非同期コールバック関数
展望: 私はいくつかの VB6 ActiveX アプリケーションを C#.net にアップグレードしています。それらはすべて、参照された VC++.net 実行可能ファイルに登録するコールバック関数を使用して互いに通信します。
次の VB6 機能を C# で複製することはできません。メソッドを含むインスタンス化されたクラスをコールバック関数パラメーターとして VC++ に渡す VB6 の機能。VC++ は非同期通信のコールバック関数として登録します。
アップグレードは、 CallBack 関数という 1 つの問題を除けば非常にうまくいきました ...そして、私は 2 週間もその問題に取り組んでいます。私を助けてください!!!
コールバック関数をデリゲートとして渡す方法を理解しました。これは、C# DynamicInvoke で動作するようになりましたが、VC++ で動作するにはこれが本当に必要です。
VC++ステートメントから取得し続けるエラー メッセージは、「パラメーターの数が無効です」です。 invoke
以下に、非同期コールバックを処理する VB6 および VC++ 機能の概要を説明しました。VB6 ActiveX コンポーネントはそれぞれ、1 つのメソッドを含むクラスをコールバック関数として VC++ 実行可能ファイルに渡します。VC++ 実行可能ファイルは、後で使用するためにコールバックを配列に保存します。これは既存のコードであるため、期待どおりに動作します。
以下は、インスタンス化され、コールバックとして使用されるVB6クラス
です。Class1
Attribute Notify.VB_UserMemId = 0
上記のコードは、混乱を避けるために簡略化されています。
以下は、 VC++ 実行可能ファイル ( ) をインスタンス化し、インスタンス化されたものをコールバック パラメータとして渡すVB6コードです。VCCallbackHandler
Class1
VC++ コードはコールバックを登録し (以下を参照)、後で (非同期で) VC++ は、他のイベントによってプロンプトが表示された場合にコールバックを利用できます (以下の「BroadCast」を参照)。この場合、VC++ exe は、複数の同時実行アプリの中央コールバック ハンドラーとして機能しています。各アプリはコールバックを VC++ コールバック ハンドラーに登録しており、あるアプリが別のイベントを呼び出して VC++ callbackHandler を呼び出すと、すべてのコールバックが呼び出されます。このようにして、コールバック ハンドラは、これらすべての他のアプリケーションが相互に通信できるようにします。
以下は、関連するVC++.Netコールバック コードです。
コールバックの登録:
コールバックの呼び出し:
ノート。 上記の作品。
考えられる解決策は 2 つあります。
- C#: C# でメソッドをパラメーターとして渡す方法。デリゲートを使用してそれを行う方法を見つけましたが、VC++ はデリゲートではなくメソッドを必要としています。
- VC++: 呼び出すコールバックとしてメソッドではなくデリゲートを処理するように VC++ を取得する方法。
次のC#コード スニペットのいずれでも成功しませんでした: `
Marshal.GetFunctionPointerForDelegate
GCHandle
KeepAlive
私はそこに誰かがこの問題を抱えていて、行くことができることを願っています... スナップ...簡単です..これを使用してください...交差した指。
c# - メソッド 'System.Object DynamicInvoke(System.Object[])' は SQL への変換をサポートしていません
という名前のテーブルがPoll
あり、配列に属する ID を持つすべてのポーリングを一覧表示する LINQ 拡張機能を作成したいとします。例:
エラーが発生する理由がわかりませんListFail
ToList()
前に追加したときはWhere
うまくいきましたが、もちろんテーブルListOK
全体を取得したくありません。Poll
何か案が?
c# - マルチキャストデリゲートで低速のDynamicInvokeを使用する代わりの方法
基本クラスに次のコードがあります。
このコードサンプルは、マルチキャストデリゲートとして表されるイベントの呼び出しを担当します。この場合、呼び出しターゲットには、クロススレッドを考慮しない小さなクラスだけでなくISynchronizeInvoke
、Windowsフォームコントロールのようにクロススレッドを実装および処理するクラスも含まれます。
理論的には、このスニペットは非常にうまく機能し、エラーは発生しません。しかし、DynamicInvoke
それがアプリケーションの現在のボトルネックであることは言うまでもなく、は信じられないほど遅いです。
だから、私の質問があります:イベントを直接サブスクライブするために機能を壊すことなく、この小さな機能をスピードアップする方法はありますか?
すべてのイベント/委任の署名は(object sender, EventArgs param)
c# - 動的呼び出しで巻き戻されたスタックを含むパズル
これは、今朝あまりうまくいかなかった質問のバージョンを提示する新しい試みです。
次のプログラムを考えてみましょう。このプログラムは、Visual Studio 2010 内で 1 回実行し、実行可能ファイルを直接ダブルクリックしてもう一度実行します。
VS の実行中に Foo の例外がトリガーされると、デバッガーはスタックを正しく表示し、Foo の 2 番目の WriteLine で問題が発生したことを示します。
しかし、実行可能ファイルを直接実行しているときに例外が発生すると、CLR から小さなポップアップ ウィンドウが表示され、プログラムが未処理の例外をスローしたことが示されます。[デバッグ] をクリックし、VS デバッガーを選択します。この場合、スタックは最新の .DynamicInvoke の時点まで巻き戻され、デバッガーでアタッチすると、例外の時点で存在していたスタック コンテキストが部分的に失われます。
例外イベントの「内部例外」部分内に、限られた形式で存在します。クリックして関連情報を展開し、問題が発生した行番号を見つけます。しかし、明らかにローカル変数やその他のコンテキストはなくなります。
.DynamicInvoke を使用せずに同じことを試みた場合 (たとえば、Main の 1 行目で Foo(1, null) を呼び出す)、それでも .exe ファイルをダブルクリックすると、デバッガーがアタッチされたときに正しい行番号が取得されます。 . 同様に、.exe をクリックしてアプリケーションを起動すると、例外がスローされる前にデバッガーがアタッチされます。
動的リフレクション/呼び出しを使用するアプリケーションがこの問題を回避する方法を知っている人はいますか? 私の意図した使用例では、名前はここでは言及しませんが、.DynamicInvoke で使用されるオブジェクトの型シグネチャや、採用される引数の数さえも予測できません。静的型付けやジェネリックでさえ、これを回避する方法ではありません。
私の質問は次のとおりです。例外がスローされた後にプログラムにアタッチするときと、デバッガーから直接実行するときの動作が異なる理由を誰か知っていますか?
c# - 後で代理人を呼び出すこと。デリゲートキュー
だから私はc#にかなり慣れていないので、この問題に遭遇しました。異なるデリゲートを呼び出すメソッドがいくつかあります(引数の種類が異なる可能性があります)。ただし、これらの代理人はすぐに呼び出されるべきではありません。メインスレッドがデリゲートを実行している場合は、デリゲートをキューに入れて後で実行するように、後で実行する必要があります。
これでDynamicInvokeを使用できる可能性がありますが、キューの速度が大幅に低下するかどうかはわかりません。さらに、デリゲートタイプと、検索するパラメーターの種類がわかっているため、ランタイムに依存しません。できれば助けてください、私は本当に答えが必要です。
みんなありがとう(応答してくれます)
c# - DynamicInvoke および Invoke での奇妙な動作
この投稿を読んで、同じことをしようとしましたが、del.DynamicINvoke(args) と比較すると、非常に奇妙な動作に遭遇しました。del(引数)
アップデート
したがって、Jon と usr のコメントの後、新しい作業コードを投稿します。
どんな助けにも本当に感謝します!
コード:
結果:
「a」が空のメソッドで、ループが 1000000 回実行される場合、DynamicInvoke は約 4000 ミリ秒かかり、直接 Invoke は 20 ミリ秒かかりました。
Thread.Sleep(20) に入れてループを 1000 回実行すると、DynamicInvoke と直接 Invoke に約 20 秒かかりました
ps 何らかの理由で vs からコピー/貼り付けできないので、構文エラーが表示された場合は手動でコードを記述します。お知らせください