暴露给 VBA (COM) 的 C# 属性:运行时错误“424”:需要对象

2023-12-19

此 C# 代码位于 .NET 4.5 中ComVisible集会:

C# Code

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("22341123-9264-12AB-C1A4-B4F112014C31")]
public interface IComExposed
{
    double[] DoubleArray { get; set; }
    object[] ObjectArray { get; set; }
    object PlainObject { get; set; }
    double ScalarDouble { get; set; }
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("E4F27EA4-1932-2186-1234-111CF2722C42")]
[ProgId("ComExposed")]
public class ComExposed : IComExposed
{
    public double[] DoubleArray { get; set; }
    public object[] ObjectArray { get; set; }
    public object PlainObject { get; set; }
    public double ScalarDouble { get; set; }
}

从 Excel 2010 32 位 VBA 中,我得到以下行为:

VBA Code

Dim VBArray(1 To 3) As Double
VBArray(1) = 1
VBArray(2) = 2
VBArray(3) = 3

Dim oComExposedEarlyBinding As New ComExposed

' Works
oComExposedEarlyBinding.ScalarDouble = 5

' Compile Error: Function or interface marked as restricted,
' or the function uses an Automation type not supported in Visual Basic
oComExposedEarlyBinding.DoubleArray = VBArray

' Compile Error: Function or interface marked as restricted,
' or the function uses an Automation type not supported in Visual Basic
oComExposedEarlyBinding.ObjectArray = VBArray

' Run-time error '424': Object required
oComExposedEarlyBinding.PlainObject = VBArray

' Run-time error '424': Object required
oComExposedEarlyBinding.PlainObject = 5

Dim oComExposedLateBinding As Variant
Set oComExposedLateBinding = New ComExposed
 
' Works
oComExposedLateBinding.ScalarDouble = 5

' Run-time error '5': Invalid procedure call or argument
oComExposedLateBinding.DoubleArray = VBArray

' Run-time error '13':  Type mismatch
oComExposedLateBinding.ObjectArray = VBArray
 
' Works
oComExposedLateBinding.PlainObject = VBArray

' Works
oComExposedLateBinding.PlainObject = 5

正如您所注意到的PlainObject在后期绑定模式下工作,但显然,以丢失打字为代价,因此在 VBA 中丢失自动完成(IntelliSense),这在我的场景中是不可接受的。

我在示例中关心的行如下:

oComExposedEarlyBinding.DoubleArray = VBArray
oComExposedEarlyBinding.ObjectArray = VBArray
oComExposedEarlyBinding.PlainObject = VBArray

让上面三行中的任何一行工作都可以满足我的需要,那么您是否有任何解决方法或解决方案可以使这项工作正常进行(请注意,我对将数组作为参数传递给函数不感兴趣)?

Update:将这个问题提交给微软的支持后,等待了近三周。他们确认这是一个错误,这是知识库:https://web.archive.org/web/20140531181434/http://support.microsoft.com/kb/327084 https://web.archive.org/web/20140531181434/http://support.microsoft.com/kb/327084C# 中唯一的解决方法是下面标记的解决方案。 但是,我可以确认如果用 C++/CLI 编写此代码,它可以按预期工作。


VBA 数组必须从零开始,在 C# 中使用 ref 参数,示例:

Option Explicit

Sub test()
    Dim VBArray(0 To 2) As Double
    VBArray(0) = 1
    VBArray(1) = 2
    VBArray(2) = 3

    Dim oComExposedEarlyBinding As New ComExposed
    oComExposedEarlyBinding.SetDoubleArray VBArray

End Sub

using System.Runtime.InteropServices;

namespace COMVisibleTest
{
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    [Guid("22341123-9264-12AB-C1A4-B4F112014C31")]
    public interface IComExposed
    {
        void SetDoubleArray(ref double[] doubleArray);
    }

    [ClassInterface(ClassInterfaceType.None)]
    [Guid("E4F27EA4-1932-2186-1234-111CF2722C42")]
    [ProgId("ComExposed")]
    public class ComExposed : IComExposed
    {
        private double[] _doubleArray;

        public void SetDoubleArray(ref double[] doubleArray)
        {
            _doubleArray = doubleArray;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

暴露给 VBA (COM) 的 C# 属性:运行时错误“424”:需要对象 的相关文章

  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且

随机推荐

  • 发生异常时整个 blazor Web 应用程序停止工作

    请为我提供以下问题的任何合适的解决方案 当 blazor 应用程序抛出任何异常时 整个应用程序就会崩溃并且没有链接起作用 直到我可以再次通过工作室运行该应用程序 对于这个问题该怎么办 谢谢并致以诚挚的问候 Edited 为了提供所需的信息
  • recaptcha 没有通过 selenium python 中的 anticaptcha 插件解决

    我最近开始在一个涉及自动化的项目中使用 selenium 该计划中的障碍之一是 ReCaptcha 系统 因此我决定使用反验证码作为当我的机器人遇到验证码时解决验证码的服务 我正确安装了该插件 并在他们的网站上找到了一些带有硒的测试代码 f
  • 什么是声明式编程? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 将行添加到具有动态列的 HTML 表中

    我正在使用下面的代码 作为上一个问题的解决方案提供将 mySQL 记录显示为 HTML 表列 https stackoverflow com questions 21870246 display mysql records as html
  • 如何判断 Windows 上的 Python 进程是否响应

    我正在编写一个 python 脚本来保持有错误的程序打开 我需要弄清楚该程序是否没有响应并在 Windows 上将其关闭 我不太清楚该怎么做 在 Windows 上您可以执行以下操作 import os def isresponding n
  • ggplot 中月份缩放时条形宽度不一致

    查了好久 没找到讨论类似问题的帖子 我在日期缩放方面遇到问题ggplot 我认为这与方式有关ggplot正在处理日期 我试图消除列之间的所有空白 因为我的最终结果将类似于以下内容 这是一个显示跨月项目的容量规划图表 即使使用默认的缩放和宽度
  • 用 rgl 填充球体上的区域

    这是世界各国首都的球形 Vorono 镶嵌 我有定义每个国家边界的点的坐标 我想用颜色填充这些国家 动机是用与海洋相同的颜色绘制沃罗诺伊边缘 这样我们就不会在国外看到它们 换句话说 我正在寻找类似于polygon函数 但适用于球面多边形 E
  • JSON、Jackson 和多行字符串

    我有以下 JSON content value 我让 Jackson 构建 JSON 字符串 如果该值是多行文本 例如 A B C 我看到的是 content A r nB r nC 它明确规定 r n CRLF 每行 我想知道我是否可以配
  • 单击时使用 jQuery 获取输入值[重复]

    这个问题在这里已经有答案了 我有以下内容 checkbox click function console log this ajax type POST url loadProducts data success function resp
  • iPhone SDK - 带 + 联系人按钮的 UITextField

    在某些应用程序 例如邮件 中 当您有 UITextField 时 右侧会有一个小 按钮 当您点击它时 会出现一个模式视图控制器 您可以从中选择电话号码 地址等 它将出现在文本字段中 我想知道如何在我自己的应用程序中实现这一点 谢谢 Isaa
  • Android:: 使用其他 InputFilter 以编程方式设置 EditText 的最大长度

    我像这样使用 InputFilter 只允许字母和数字 private InputFilter inputFilters new InputFilter new InputFilter Override public CharSequenc
  • 零是有效的句柄吗?

    有一个SafeHandleZeroOrMinusOneIsInvalid NET Framework 中的类 以及SafeHandleMinusOneIsInvalid class 为什么是这样 在哪些情况下零是有效句柄 作为其他答案的补充
  • 桌面 MEF 中的 ExportFactory 去了哪里?

    我找不到它 ExportFactory
  • 无法使用 SQL Native Client 从经典 ASP 连接到 SQL Server 2008 R2 (Windows 7 - IIS7)

    当我使用时 我能够连接到 SQL Server 2008 R2Provider SQLOLEDB在我的连接字符串中 但是当我使用Provider SQLNCLI在连接字符串中我无法连接 ADODB 连接错误 800a0e7a 找不到提供者
  • Qt 中同一标题栏中的最小化按钮和上下文帮助按钮

    要在 QWidget 类型的 Qt 窗口的标题栏中制作帮助按钮 我喜欢这样 myWindow gt setWindowFlags Qt WindowContextHelpButtonHint 这很好用 要在同类窗口的标题栏中制作最小化按钮
  • 如何追踪修订历史记录?

    我正在开发一个编程教程项目 我希望本教程的示例源代码具有有意义的修订历史记录 与教程的进度相关 不可避免的是 我不会在第一次就完全正确地获得所有教程提交 并且我不希望修订历史记录中充斥着我以元方式修改教程提交的提交 我认为这意味着我需要两个
  • Django 发送 POST 请求时返回 403 错误

    当我使用以下 Python 代码向我的 Django 网站发送 POST 请求时 出现 403 Forbidden 错误 url http www sub example com values var test try data urlli
  • 停止 NSView 打印

    我在 Xcode 中有一个非常基本的 Mac 应用程序 带有一个分割视图 其中包含一个 PDFThumbnailView 和一个 PDFView 就像预览一样 除了将 PDF 加载到视图所需的代码之外 几乎没有任何 Swift 代码 但是
  • 通过 Intent 将对象作为 Parcel(带有文件描述符)发送会导致异常

    我正在尝试将 StatusBarNotifications 数组发送到我的另一个服务 所以我已经这样做了 服务延伸NotificationListenerService Override public void onNotification
  • 暴露给 VBA (COM) 的 C# 属性:运行时错误“424”:需要对象

    此 C 代码位于 NET 4 5 中ComVisible集会 C Code InterfaceType ComInterfaceType InterfaceIsDual Guid 22341123 9264 12AB C1A4 B4F112