问题标签 [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.

0 投票
3 回答
6875 浏览

c# - 在这个通用代码中可以避免 Delegate.DynamicInvoke 吗?

这个问题部分是关于代表的,部分是关于泛型的。

给定简化的代码:

我在 SO 的其他地方读到,直接调用委托(带括号)比调用快几个数量级DynamicInvoke,这是有道理的。

对于上面的代码示例,我想知道是否可以执行类型检查并以某种方式提高性能。

一些上下文:我有一个对象流,这些对象流被分配给各种处理程序,并且这些处理程序可以在运行时注册/注销。上面的模式非常适合我的目的,但如果可能的话,我想让它更快捷。

一种选择是将代表存储Action<object>Dictionary, 并用另一个代表包装Action<T>代表。我还没有比较第二次间接调用会影响的性能变化。

0 投票
1 回答
1033 浏览

c# - 从 c# 动态调用非托管 VB COM dll 时遇到问题?

我从 c# 调用非托管 VB COM dll 时遇到问题。这是使用 loadLibrary 和 GetProcAddress 的动态调用。

我可以使用 loadLibrary 成功加载 dll,但 GetProcAddress 始终返回 0。它没有记录任何错误消息,什么也没有。它只返回 0。

在示例代码下方

VB COM

c# 代码

和调用代码

有人可以帮我吗..

更新:

如果组件已注册,我可以成功调用方法。使用下面的代码

如果 dll 没有注册,有什么办法吗?

0 投票
3 回答
3959 浏览

c# - 有没有办法在 C# 中进行动态隐式类型转换?

给定带有隐式强制转换运算符的此类:

我现在可以执行以下操作:

但不是以下内容:

这给出了编译时间:

无法将类型“object”隐式转换为“MyDateTime”。

我感觉合理。

现在我将前面的例子修改如下:

这编译得很好。现在我得到一个运行时InvalidCastException

无法将“System.Int64”类型的对象转换为 MyDateTime 类型。

这告诉我,C# 隐式转换运算符仅在编译时应用,而不是在 .NET 运行时尝试将对象动态转换为另一种类型时应用。

我的问题:

  1. 我对么?
  2. 还有其他方法可以做到这一点吗?

顺便说一句,完整的应用程序是我Delegate.DynamicInvoke()用来调用一个带MyDateTime参数的函数,而我传递给的参数的类型DynamicInvoke是 long。

0 投票
1 回答
901 浏览

java - 为动态调用的方法生成调用层次结构

当今动态调用、反射和运行时注入的世界与ctagsdoxygen和 CDOC 等传统工具并不能很好地配合使用。

我正在寻找可以显示静态和动态方法调用的方法调用层次结构可视化工具。它应该易于使用,在执行过程中轻便,并提供有关记录的运行时会话的有用详细信息。

现在我猜Callgrind可以被认为是 C 族的有效解决方案。

您建议使用什么工具/技术为基于 JVM 的字节码的静态和动态方法调用创建调用图?预期的最终结果是图形显示(最好是交互式的),它可以显示从 main() 到被调用的每个方法的路径。

在研究这篇文章的过程中,我偶然发现了javashot,这似乎是我想要的一种方法,我希望这将被集成到一种探查器或类似的东西中,而不是可以在我的 IDE 中使用( Eclipse、IntelliJ、Netbeans 等)。

谢谢你,马克西姆。

0 投票
1 回答
1143 浏览

c# - 回调函数:将回调从 C# winform 应用程序传递到引用的 VC++ Exe

异步回调函数

观点:我正在将几个 VB6 ActiveX 应用程序升级到 C#.net,它们都使用回调函数相互通信,它们向引用的 VC++.net 可执行文件注册。

我无法在 C# 中复制以下 VB6 功能: VB6 将包含方法的实例化类作为回调函数参数传递给 VC++ 的能力,然后 VC++ 将其注册为异步通信的回调函数。

除了这个问题之外,升级进行得非常好: 回调函数 ……我现在已经坚持了两个星期。请帮我!!!

我已经弄清楚如何将回调函数作为委托传递,我已经设法使用 C# DynamicInvoke,但是我真的需要它才能在 VC++ 中工作。

我从VC++语句中不断收到的错误消息是"Invalid Number of Parameters" invoke


下面我概述了处理异步回调的 VB6 和 VC++ 功能。每个 VB6 ActiveX 组件都将一个包含单个方法的类作为回调函数传递给 VC++ 可执行文件,VC++ 可执行文件将回调保存在一个数组中供以后使用。由于这是现有代码,因此可以按预期工作。

以下是被实例化并用作回调的VB6类: 请注意:Class1
Attribute Notify.VB_UserMemId = 0

上面的代码已被简化以避免混淆。

下面是实例化 VC++ 可执行文件 () 的VB6代码,VCCallbackHandler并将实例化的对象Class1作为回调参数传递给它

VC++ 代码注册回调(见下文),然后(异步)VC++ 可以利用回调,如果由其他事件提示(见下文'BroadCast')。在这种情况下,VC++ exe 充当多个同时运行的应用程序的中央回调处理程序。每个应用程序都向 VC++ 回调处理程序注册了它们的回调,并且当一个应用程序通过调用另一个事件来提示 VC++ 回调处理程序时,将调用所有回调。通过这种方式,回调处理程序允许所有这些其他应用程序相互通信。

下面是相关的VC++.Net回调代码。

注册回调:

调用回调:

笔记。 以上工作。

有两种可能的解决方案:

  1. C#:如何让 C# 将方法作为参数传递。我想出了如何使用委托来做到这一点,但是 VC++ 想要一个方法而不是委托。
  2. VC++:如何让 VC++ 处理委托而不是方法作为要调用的回调。

我对以下任何c#代码片段都没有成功:`

  • Marshal.GetFunctionPointerForDelegate
  • GCHandle
  • KeepAlive

我希望那里有人遇到过这个问题,并且可以去...... SNAP......它很容易......使用这个......交叉手指。

0 投票
1 回答
1325 浏览

c# - 方法“System.Object DynamicInvoke(System.Object[])”不支持 SQL 转换

假设我有一个名为的表Poll,我想编写一个 LINQ 扩展来列出所有 ID 属于数组的轮询。例如:

我不知道为什么我得到错误ListFail

当我添加ToList()之前Where,它运行良好,ListOK但我当然不想得到整张Poll桌子。

任何想法?

0 投票
2 回答
6358 浏览

c# - 在多播委托上使用慢 DynamicInvoke 的替代方法

我在基类中有以下代码:

此代码示例负责调用一个事件,表示为多播委托,其中调用目标包括不关心跨线程的小类,以及实现ISynchronizeInvoke并非常关心跨线程的类,如 Windows 窗体控件。

理论上,这个片段工作得很好,没有错误发生。但是DynamicInvoke速度非常慢,并不是说它是当前应用程序的瓶颈。

所以,我的问题是:有没有办法在不破坏功能直接订阅事件的情况下加速这个小功能?

所有事件/代表的签名是(object sender, EventArgs param)

0 投票
2 回答
858 浏览

c# - 涉及动态调用的展开堆栈的难题

这是今天早上提出的一个不太成功的问题的新尝试。

考虑以下程序,我们将在 Visual Studio 2010 中运行一次,然后再次直接双击可执行文件

当 Foo 中的异常在运行 VS 时触发时,调试器会正确显示堆栈并显示问题发生在 Foo 中的第二个 WriteLine 上。

但是,当直接运行可执行文件时发生异常时,CLR 会弹出一个小窗口,表明程序抛出了未处理的异常。单击调试并选择 VS 调试器。在这种情况下,堆栈展开到最近的 .DynamicInvoke 点,并且当您使用调试器附加时,异常发生时存在的堆栈上下文已部分丢失。

它确实以有限的形式存在于异常事件的“内部异常”部分。您单击以展开相关信息并找到出现问题的行号。但显然局部变量和其他上下文将消失。

如果尝试相同的事情但没有 .DynamicInvoke(例如,在 Main 的第 1 行调用 Foo(1, null)),仍然通过双击 .exe 文件,当调试器附加时,我们确实得到了正确的行号. 类似地,如果通过单击 .exe 启动应用程序,但在抛出异常之前附加了调试器。

有谁知道使用动态反射/调用的应用程序如何避免这个问题?在我的预期用例中,在我不会在这里提及的名称的系统中,我无法预测将在 .DynamicInvoke 中使用的对象的类型签名,甚至无法预测将使用的参数数量,因此静态类型甚至泛型都不是解决这个问题的方法。

我的问题是:有谁知道为什么我们在直接从调试器运行时与在抛出异常后附加到程序时会得到如此不同的行为?

0 投票
2 回答
1819 浏览

c# - 稍后再调用代表。委托队列

所以我对 c# 很陌生,我已经解决了这个问题:我有一些调用不同委托的方法(可能具有不同的参数类型)。但是,不应立即调用这些代表。如果主线程正在运行一个委托,它们应该在之后运行,有点像排队委托并稍后运行它。
现在我可能可以使用 DynamicInvoke 但我不知道它是否会使队列减慢太多,除了我知道委托类型是什么以及它应该寻找什么样的参数,所以它并不是真正依赖于运行时。如果可以的话请帮助我,我真的需要一个答案。

谢谢大家(谁回复)

0 投票
2 回答
654 浏览

c# - DynamicInvoke 和 Invoke 的奇怪行为

我读了这篇文章并尝试做同样的事情,但是在比较 del.DynamicINvoke(args) 与时遇到了一个非常奇怪的行为。德尔(参数)

更新

因此,在 Jon 和 usr 评论之后,我现在发布了新的工作代码。

我真的很感激任何帮助!

代码:

结果:

当“a”为空方法并且循环运行 1000000 次时,DynamicInvoke 大约需要 4000 毫秒,直接调用需要 20 毫秒

当我放入 Thread.Sleep(20) 并且循环运行 1000 次时,DynamicInvoke 和直接 Invoke 大约需要 20 秒

ps 由于某种原因,我无法从 vs 复制/粘贴,所以如果您看到语法错误,我会手动编写代码,请告诉我