无法访问 VBA 中的 COM 公开方法

2024-05-06

我正在尝试在 VBA 中访问 COM 公开的方法。

Problem:我看到所有默认方法(例如GetHashCode, GetType and ToString) 在 VBA 中但是not那些是 COM 接口的一部分并且专门编写为 COM 可见的(例如getStringValue() below).

设置详情:

  • 视觉工作室2008
  • Windows 7 x64
  • 办公室2007
  • .NET 3.5

接口“IGetMyString.cs”

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace SimpleCOMAssembly
{
    [ComVisible(true), GuidAttribute("4153A1AC-ECE9-4f66-B56C-1DDEB6514D5D")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    interface IGetMyString
    {
        [DispId(1)]
        string getStringValue();
    }
}

实施“GetMyString.cs”

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace SimpleCOMAssembly
{
    [ComVisible(true), GuidAttribute("0A3D4D65-CF50-4020-BF13-77001F8AAABE")]
    [ProgId("SimpleCOMAssembly.GetMyString")]
    [ClassInterface(ClassInterfaceType.None)]
    public class GetMyString : IGetMyString
    {
        public GetMyString() { }

        [ComVisible(true), Description("Get my string")]
        public string getStringValue()
        {
            return "hello";
        }
    }
}

在构建属性中,我检查了“使程序集 COM 可见”(见下面的快照)

还要求 Visual Studio 2005 制作“注册 COM 互操作”(见下面的快照)

最后,作为构建后事件,我运行 regasm.exe 来注册 .DLL 以及 .TLB 到注册表,如下所示:

%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\regasm /codebase "$(TargetPath)" /tlb:"$(TargetDir)$(TargetName).lib"

In Excel Object Explorer view, I enabled COM server (SimpleCOMAssembly written above), and now in the Object Explorer it does not list down the COM interface method (see below) enter image description here

有人可以帮助我知道我缺少什么导致 COM 接口方法未在 VBA 中显示吗?

EDIT Attaching ITypeLib View of the generated TLB enter image description here


Excel对象浏览器屏幕截图清楚地显示了一个问题。请注意 GetHashcode、GetType 和 ToString 方法如何可见。这些是从 System.Object 继承的方法。但是您的代码片段明确(且正确)使用 [ClassInterface(ClassInterfaceType.None)] ,以便隐藏类实现。

它没有被隐藏。不太确定这是如何发生的,早期尝试的旧类型库可以解释它。但你的构建步骤非常可疑,你帮助太多了。 “使程序集类型 COM 可见”选项是强制构建系统公开 .NET 类型的一种非常粗略的方法。但是您的代码正在使用精炼的“喝茶时右上小指朝上”的方式向 COM 公开类型。其中包括 [ComVisible(true)] 属性(该复选框执行的操作)和 [ClassInterface] 属性(该复选框不执行的操作)。

所以问题是你要求构建系统实现two接口。无论它从基类继承什么,在您的情况下为 _Object,加上它从声明继承的内容,在您的情况下为 IMyGetString。这很好,而且完全与 COM 兼容,但 VBA 并不是一个很好的 COM 使用者。它只喜欢 [Default] 接口,在您的情况下就是 _Object 。从截图中清晰可见。

因此关闭“使程序集 COM 可见”选项。

并在调用 Regasm 的构建后事件或“注册 COM 互操作”复选框之间进行选择。如果同时使用这两种方法,您不知道为什么不起作用的可能性就会加倍。仅当需要注册 64 位版本 Office 的程序集时才需要构建后。

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

无法访问 VBA 中的 COM 公开方法 的相关文章

  • C# 可空相等运算,为什么 null <= null 解析为 false? [复制]

    这个问题在这里已经有答案了 为什么在 NET中会这样 null gt null 解析为 false 但是 null null 解析为真 换句话说 为什么不null gt null相当于null gt null null null 有谁有官方
  • 在Excel VBA中将图像(jpg)转换为base64?

    我需要在 Excel 中转换图像 或通过VBA 转为base64 最后我将进行XML输出 我怎样才能做到这一点 我需要引用 DOM 吗 我一直在读书这个问题 https stackoverflow com questions 169907
  • 将 SQL Server 与 Dart 结合使用

    我还没有找到很好的答案 所以我想尝试一下得到答案 将 Microsoft SQL Server 与 Dart 结合使用的最佳方式是什么 我需要它能够从基本上任何操作系统 网络和移动设备上使用它 我觉得最好的方法可能是 GraphQL 但我对
  • 颜色变换器功能上的堆栈溢出错误

    我有两种颜色 红色 和 鲑鱼色 我需要动态创建面板以及面板背景颜色 这些颜色必须介于两种颜色之间 红色 public Color x y protected void Page Load object sender EventArgs e
  • 在网站/Web 应用程序项目和 Script#/ScriptSharp 之间共享代码

    我向我的网站项目添加了一个 Script 项目 并创建了一个包含两个类的小型示例库 现在我想使用网站代码中的这些类 在本例中 我创建了一个简单的对象树并将其序列化为 JSON 然后由客户端代码获取 我尝试添加对 Script 项目的引用 它
  • 从Excel工作表中读取汉字? (总是返回“???”)

    如何从Excel单元格中读取汉字并将其写入文件 当我取值时 Worksheets ActiveCell Worksheet Name Cells 3 columnNumbers 0 value 它总是返回 Dim fileStream Fi
  • 如果将其名称作为参数传递,如何在方法中打开表单

    我正在尝试创建一个标准方法来根据传递给它的参数打开表单 基本上 要完成此任务 using Quotes newQte new Quotes newQte ShowDialog 通过替换 Quotes with a passed parame
  • List 与 IEnumerable 的协变和逆变

    所以 假设我有 Public Interface ISomeInterface End Interface Public Class SomeClass Implements ISomeInterface End Class 如果我有MyL
  • 连接到 Facebook 并使用 api

    有没有好的教程如何制作简单的控制台 Facebook 应用程序 连接到 Facebook 并获取朋友列表 用户照片 状态或其他内容 我查看了 facebook SDK 的 facebook 示例 但如果我想在 facebook 上授权 我必
  • 找不到 OAuth2 参数

    我正在尝试使用 OAuth 2 0 来授权 google docs API 根据谷歌给出的例子https developers google com google apps documents list authorizing reques
  • 我需要从 64 位 exe 访问 32 位 dll

    我知道我阅读了有关代理进程的所有内容 并且我能够创建代理 COM 但它要么全部在 32 位中工作 要么全部在 64 位中工作 正确的结构是什么 1 32 dll 我尝试了以上两种方法 但没有成功调用32 dll 我不太了解您所指的代理 CO
  • 在c#中创建sql连接

    我是这个网站的新手 也是编程的新手 我目前正在通过销售点创建库存系统 它使用模态和非模态形式 我的问题是 我正在研究change password对话框必须连接到数据库才能覆盖密码字段 我使用的数据库是Microsoft SQL Serve
  • 如何在缩进层次结构中找到父级?

    我目前有一张 Excel 工作表 其中包含缩进的项目层次结构 如下所示 每个项目都缩进 每个缩进四个空格 以显示它如何适应整体层次结构 我已经能够创建一个 级别 列 将缩进级别转换为数字 Item Level Parent P1 1 N A
  • 为什么 ᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᏍᎦᏚᎩ 是美国的本土名称?

    当我使用这段代码时 var ri new RegionInfo us var nativeName ri NativeName why is nativeName然后是字符串 in Cherokee https en wikipedia o
  • 生成尽可能最快的可执行文件

    我有一个非常大的程序 我一直在 Visual Studio 下编译 v6 然后迁移到 2008 我需要可执行文件尽可能快地运行 该程序大部分时间都花在处理各种大小的整数上 并且执行很少的 IO 显然 我会选择最大优化 但似乎可以做很多不属于
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 有没有办法设置 log4net 内存附加程序可以包含的最大错误消息数?

    我想向根记录器添加一个内存附加程序 以便我可以连接到应用程序并获取最后 10 个事件 我只想保留最后 10 个 我担心这个附加程序会消耗太多内存 该应用程序设计为 24 7 运行 或者还有别的办法吗 您需要创建一个自定义附加程序来存储有限数
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 我应该如何在 VB.NET 中进行转换?

    所有这些都相等吗 在什么情况下我应该选择其中一个而不是其他 var ToString CStr 变量 CType 变量 字符串 DirectCast 变量 字符串 编辑 来自的建议不是我自己 https stackoverflow com

随机推荐