【问题标题】:IntelliSense in custom COM classes in VBAVBA 中自定义 COM 类中的 IntelliSense
【发布时间】:2017-04-30 23:07:53
【问题描述】:

有没有办法在 VBA 中自己构建的 COM 类中获取 IntelliSense?

例如在下面的示例中,每当我按下点(或 ctrl+空格作为快捷键)时,我都希望显示“数字”:

我想,如果以某种方式解决了这个问题,我还会在这里获得一些关于对象的公共功能的信息:

那么,有什么建议呢?

建议一

【问题讨论】:

  • 你见过this?
  • 问题是how,在我的情况下它根本不显示。
  • 转到 VBA 中的对象浏览器,然后右键单击成员窗格并选择“显示隐藏的成员”。然后,您应该能够在对象浏览器中看到所有成员,并且您将在代码窗格中获得 Intellisense。
  • 谢谢,我做到了,但是没有用。 (请参阅更新后的问题以获取屏幕截图)
  • 属性不足。公开一个类通常不是一个好主意,像 GetType()、MemberwiseClone() 这样的继承成员没有用,并且拖累了对 .NET 框架类的类型库的依赖。所以默认的[ClassInterface]是ClassInterfaceType.AutoDispatch。它仅支持后期绑定(慢速)并且不支持 IntelliSense。您要求 ClassInterfaceType.AutoDual。暴露一个接口更好,隐藏继承的成员并且是COM方式并允许ClassInterfaceType.None

标签: c# vba visual-studio com intellisense


【解决方案1】:

简单示例可能如下所示。

c#类库名为IntellisenseDemo代码

using System;
using System.Runtime.InteropServices;

namespace IntellisenseDemo
{
    [ComVisible(true)]
    [Guid("41B3F5BC-A52B-4AED-90A0-F48BC8A391F1")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IIntellisenseDemo
    {
        int Number { get; set; }
        string TestString(string name);
    }

    [ComVisible(true)]
    [Guid("20EBC3AF-22C6-47CE-B70C-7EBBA12D0A29")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("IntellisenseDemo.Demo")]
    public class Demo : IIntellisenseDemo
    {
        public int Number { get; set; }
        public string TestString(string name)
        {
            throw new NotImplementedException();
        }
    }
}

注意[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 表示接口作为分发接口暴露给 COM,它只启用后期绑定。

[ClassInterface(ClassInterfaceType.None)] 表示 CLR 不公开此类型的类接口。 COM 客户端可以使用IIntellisenseDemo 接口中的方法调用此类的成员。

再高潮

C:\Windows\Microsoft.NET\Framework\v4.0.30319>regasm C:\Temp\IntellisenseDemo.dll /tlb: C:\Temp\IntellisenseDemo.tlb

VBA

【讨论】:

  • 看起来很有趣,我稍后会检查它。但从第一眼看 - 有没有办法让它没有接口和 withEvents?简单的东西?
  • 谢谢,它运作良好。如果可能的话,再问几个关于您的代码的问题。来自哪里: [ComVisible(true)] [Guid("41B3F5BC-A52B-4AED-90A0-F48BC8A391F1")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 来自?您是否使用了一些快捷方式来创建它?考虑到我检查了“在程序集信息中使程序集 COM-Visible ”,真的需要 ComVisible(true) 吗?
  • 属性是手动添加的,所以没有捷径,简单的手写。不需要显式使用[ComVisible(true)] 属性,它更像是一个标记。您可以删除此属性,它应该仍然有效,因为托管类型默认是 COM 可见的。
  • GUID 呢?你也是手动写的吗?这是我从您的代码中制作的,删除了我不理解的东西并且它有效:github.com/Vitosh/C-Sharp-Stuff/tree/master/IntSense 再次感谢! :)
  • 是的,只需在 Visual Studio 中使用 Tools->Create GUID 并创建新的 Guid。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多