问题标签 [late-binding]

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 投票
2 回答
3837 浏览

c# - 当它具有 ref 参数时,如何从 C# 动态调用 VB6 COM 对象?

我有以下要从 C# 调用的旧版 VB6 函数。

我在 C# 中使用以下代码,但出现异常:

例外是:

我尝试更改refout但得到相同的错误。如果我省略ref,该方法执行没有错误,但当然miscRepayment仍然是 null 而不是包含应该传递出去的对象。


更新

我尝试了其他一些方法,包括使用 VB.NET(因为它一直比 C# 对 COM 更友好)。

使用以下 VB.NET 代码:

它引发以下类似但不同的异常:

有趣的是,如果我将 C# 或 VB.NET 示例代码中的调用更改为使用null/Nothing而不是,miscRepayment则代码执行时不会引发异常。我什至在 VB6 COM 对象的代码中设置了一个断点,并且可以确认代码已在该端正确执行。显然,将miscRepayment参数设置为null/Nothing后,.NET 就无法接收创建的对象。问题必须与参数的编组有关。

我也尝试过使用标记Type.InvokeMember为参数的参数,但得到以下异常:ParameterModifiermiscRepaymentref

最后,我尝试了以下 VB.NET 代码:

它抛出以下异常:

对于所有引发异常的代码,VB6 COM 对象永远不会被调用。ref尝试编组参数时,COM 互操作代码必须阻塞。

在我的 Google 搜索中,我遇到了一些使用的示例Type.InvokeMember,但ref参数始终用于简单类型,例如整数和字符串。

0 投票
1 回答
513 浏览

vb.net - 通过vb.net中的反射调用非汇编(非托管)dll中的方法?

我想使用反射在 vb.net 中动态调用 dll(不是程序集、非托管、可能是 COM 对象模型)。

我见过几种不同的方法来调用 .net 程序集的 dll 中的方法 - 但我还没有找到动态调用 dll 中的方法(如 user32.dll 或 winmm.dll)的方法。我相信这会被称为后期绑定?

我问的原因是因为我正在构建一种语言,该语言将依赖于外部库来实现许多不同的功能。

一个例子(用我正在构建的这种语言):

当我在 winmm.dll 中为调用 mciSendString 构建解释器时,如何使用反射来处理这个问题?我希望用户能够引用他们希望的任何 dll/方法。

我可以在正确的方向上获得一些指导吗?也许甚至是一些我可以分解和理解的 vb.net 代码?

0 投票
2 回答
391 浏览

c++ - 后期绑定到带有“外部”定义变量的库

我正在尝试将我的程序后期绑定到 DLL。
我知道如何导入它的方法,但在它的头文件中,我有一个这样的定义:

如何在我的程序中引用此变量而不会出现“未解析的外部符号”错误?

0 投票
2 回答
1250 浏览

c# - 使用后期绑定从 MailItem.AddressEntry 获取 MAPIOBJECT 的指定转换无效

我正在尝试使用 Outlook 后期绑定来获取 MailItem.AddressEntry 的 MAPIOBJECT。

我不断收到“调用目标引发了异常”和“指定转换无效”的内部异常,我不知道为什么。谷歌搜索等没有出现任何内容。

首先,我知道 MAPIOBJECT 已被弃用,并且通过智能感知不可见,但可以工作。

如果没有后期绑定,我可以毫无问题地获得对象。

这是代码:

0 投票
2 回答
2680 浏览

vba - 我可以在通过早期绑定使用库之前使用后期绑定来检查库的存在吗?

我喜欢在我的 VBA 项目中使用早期绑定,因为我喜欢在开发过程中自动完成方法名称等。我也喜欢知道如果我拼错了方法名,编译器会警告我的信心。

但是,要使用早期绑定,我需要添加对相关库的引用(例如,“Microsoft Scripting Runtime”)。这对于像这样的“标准”库来说很好,但有时我想使用用户机器上可能存在或不存在的库。

理想情况下,如果库不存在,我想显示一条有用的消息(例如“此计算机上未安装 xyz,因此无法使用此功能”)。如果我只使用后期绑定,那么我可以这样做:

但是,如果我添加了对该库的引用以使用早期绑定,那么如果该库不存在,则在加载 VBA 项目时会出现编译错误。因此,没有代码运行(包括检测库不存在的代码)。

这个catch-22有什么办法吗?

0 投票
5 回答
3677 浏览

java - java中反射和后期绑定的区别与实时示例

在学习 Java 教程时,Reflection 和 Late Binding 让我很困惑。在一些教程中,他们写道它们都是相同的,并且反射和后期绑定之间没有任何区别。但是其他教程说有区别。

我很困惑,所以有人可以解释一下 Java 中的反射和后期绑定是什么,如果可能的话,请给我一些真实世界的例子。

谢谢..

0 投票
4 回答
283 浏览

c++ - 在不同项目中使用的头文件中声明的纯抽象 C++ 类(没有编译时链接)是否共享相同的虚拟表模型?

我有一个 C++ 标头声明一个仅由纯虚拟方法组成的类。我有两个使用该头文件的 DLL(其中一个实现了该接口),但在编译时没有链接。一个 DLL 动态加载另一个,将已实现接口的指针传递给另一个。这些 DLL 是否共享相同的虚拟表结构?

0 投票
1 回答
2327 浏览

java - 如何重载一个方法来处理Java中参数的子类?

我有一个设计问题,我无法弄清楚如何解决。基本上我正在使用访问者来更新某个类的实例。我希望将来能够实现不同类型的更新,作为我的更新类的扩展。我还希望能够更新不同类型的对象(都派生自基类)。所以我有:

我有我的实例List<A>,我想对每个对象应用最具体的更新。但是,当我尝试将更新应用于列表的元素之一时,我总是会visit(A)被调用,而不是更具体的元素。我想那是因为它是List<A>, not List<B>or List<C>,但我希望多态性能够解决这个问题。我不能只删除visit(A)运算符,因为有时不区分 C 和 B 是有意义的。您知道如何在不visit(A)将消息发送到重载的情况下解决这个问题吗?

谢谢

0 投票
4 回答
410 浏览

vb.net - VB.NET 如何将此解析为对象属性?

好的,所以我是一名 C# 编码员,我什至无法阅读 VB.NET,所以请原谅这可能是一个非常愚蠢的问题。但我有一些看起来像这样的代码:

因此,忽略语法可能错误的事实——VB.NET 如何从 sourceObject 获取 Name 属性?在运行时检查它会发现 sourceObject 是一种类型,它支持一个名为 Name 的属性和一个 getter,但是 VB.NET 在这种情况下做了什么?编译器是否正在生成一些额外的代码,以便在运行时以某种方式自动转换?

你可能会说,我有点困惑。提前致谢!

0 投票
3 回答
402 浏览

c# - 在 .NET < 4 中使 C# 代码后期绑定的侵入性最小的方法是什么?

我正在编写一段处理 Windows 窗体控件的 C# 代码。这是一个小例子,一个小包装器,用于获取某些控件的边界矩形(在屏幕坐标中):

此代码被编译成一个库,该库作为“插件”分发,以加载到客户应用程序中。然而,事实证明,一些客户在他们的应用程序中使用的 Windows 窗体版本与我的插件所链接的版本不同。我的计划是通过使上述代码后期绑定来解决这个问题,这样它就可以与当前应用程序域中加载的任何 Windows 窗体版本一起工作。在 .NET 4 中,我可以使用dynamic关键字,但遗憾的是,这段代码也应该适用于 .NET3 应用程序。因此,我开始使用反射 API,引入了一个小助手对象,这使得使用反射 API 变得更好:

不是很漂亮。调用方需要进行大量转换,我怀疑我迟早也必须处理重载的方法或属性 - 前进的道路相当坎坷。理想情况下,包装对象将允许保持原始代码非常相同。

所以,在我开始修复LateBoundObject包装类之前,我想知道:是否有其他人有使用反射 API 使 C# 代码后期绑定的经验?如果是这样,您是如何处理它以将使用原始反射 API 的痛苦降至最低 - 您是否还使用了类似的包装类,LateBoundObject或者您是否采用了完全不同的路线?就原始代码而言,我正在寻找侵入性最小的方式。