无法访问VBA COM公开的方法(Unable to access COM exposed meth

2019-07-29 09:23发布

我试图访问VBA COM公开的方法。

问题:我看到所有的默认方法(如GetHashCodeGetTypeToString在VBA),但不是那些它们是COM接口的组成部分,专门编写为COM可见(如getStringValue()以下)。

设置的详细信息:

  • Visual Studio 2008中
  • Windows 7的64位
  • Office 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"

在Excel对象资源管理器视图,我启用COM服务器(上面写SimpleCOMAssembly),现在在对象资源管理器没有列出下来COM接口方法(见下文)

有人可以帮助我知道我缺少这是造成COM接口方法在VBA中不显示?

生成的TLB的编辑 。附接的ITypeLib查看

Answer 1:

Excel对象浏览器截图清楚地表明一个问题。 注意的GetHashCode,的GetType和toString方法是如何可见。 这些都是从System.Object中继承的方法。 但是,你的代码段明确(正确)使用[ClassInterface(ClassInterfaceType.None)],这样类的实现是隐藏的。

这是不是隐藏的。 还不知道有这回事,从早期的尝试一个旧的类型库可以解释它。 但是你的编译步骤是非常可疑的,你是在帮助太多。 “使组件类型的COM可见”选项是强制构建系统揭露.NET类型相当粗暴的方式。 但是,你的代码是用精右上小指-上时,你酒后喝茶的方式暴露类型COM。 其中包括[标记有ComVisible特性(真)]属性,该复选框做什么,并且[ClassInterface]属性,这是什么复选框没有做。

所以,问题是你问的构建系统来实现两个接口。 无论是从基类继承,_Object你的情况,再加上它在声明继承,你的情况IMyGetString。 这是很好的,所有相当COM兼容,但VBA是不是一个很好的COM消费者。 只喜欢[默认]界面,这就是_Object你的情况。 从截图中清晰可见。

所以关闭“使装配COM可见”选项。

,要么调用Regasm或“注册为COM互操作”复选框中postbuild事件之间进行选择。 这样做左右逢源只是双打,你不知道为什么它不工作的可能性。 当您需要注册组件,用于办公室的64位版本,你只需要postbuild。



Answer 2:

我也有同样的问题。 我发现这个链接。

引导调用从Excel .NET库如果我引用所谓的“Foo.tlb”一个TLB文件,其中有一个名为“FooClass”具有公共成员类。 您将无法看到那些成员,因为它们在默认情况下使用后期绑定唯一(运行时绑定)接口内置。

你可以改变你的类,以便早期绑定,这将允许智能感知和阶级的成员在对象浏览器中被曝光。

C#:

[ClassInterface(ClassInterfaceType.AutoDual)]
public class FooClass
{
    public FooClass()
    {
    }
    public string DoSomething()
    {
        return "I am printing....";
    }
}

你应该能够看到在对象浏览器中的DoSomething方法,你实现这个变化之后。 注意:您必须首先服从的dll。



Answer 3:

为了记录 - 如果任何人需要这个答案 - 我只是有相同的问题,因为这(OLEVIEW和一切),它是驾驶我坚果。 我无法弄清楚我在做什么错的,因为我之前已经创建了一些C#COM口。 我忘了申报接口(在这个岗位将被IGetMyString )为public

希望这样可以节省别人一些时间。



文章来源: Unable to access COM exposed methods in VBA