首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在C#中构建一个可从VB5/6中引用和使用的COM组件

尝试在C#中构建一个可从VB5/6中引用和使用的COM组件
EN

Stack Overflow用户
提问于 2011-04-27 21:58:51
回答 2查看 2K关注 0票数 3

我试图看看我是否可以在C# (.NET 4)中构建一个COM组件,我可以通过VB5程序使用它来访问web服务。按照我在MSDN和CodeProject上找到的所有说明,如下所示:

  • 在C#中构建COM对象
  • 示例COM类(C#编程指南)

我写了以下几封信:

代码语言:javascript
复制
[Guid("7A715F02-D349-45DC-B0AE-9925FD3B943C")]
public interface ARCOM_Interface
{
    [DispId(1)]
    string GetServiceResponse();
}

[Guid("5130F041-619E-41F9-84B6-8332642228F6")
    , InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ARCOM_Events
{
}

[Guid("0A77754F-34CF-4E0E-AAC2-85FD686758E0")
    , ClassInterface(ClassInterfaceType.None)
    , ComSourceInterfaces(typeof(ARCOM_Events))]
[ComVisible(true)]
public class ARCOM_Class : ARCOM_Interface
{
    public string GetServiceResponse()
    {
        string response = string.Empty;

        ARWebService.ARWebService svc = new ARWebService.ARWebService();

        response = svc.PingMeBack();

        return response;
    }
}

有关程序集使用强名称签名,并将输出注册为COM Interop。在构建之后,我将RegAsm应用于它,并使用tlbexp.exe生成了一个类型库。

在VB6中,当我打开来自properties的引用列表时,我可以在列表中找到程序集,并且可以检查它。我甚至可以在VB6代码中执行以下操作:

代码语言:javascript
复制
Private Sub HitWebService()

    Dim arcom As ARCOMObject.ARCOM_Class

    arcom. <== Intellisense doesn't sense anything!

End Sub

Intellisense可以看到ARCOMObject和类,但是除了通常的"GetType“、"Equals”和其他泛型对象方法/属性之外,ARCOM_Class本身中没有任何内容。更具体地说,它似乎没有看到GetServiceResponse()方法,所以我不能调用它。

我漏掉了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-27 22:40:31

我看到你想办法得到你想要的,而我正在输入这个回复,但我还是会继续,因为它可能告诉你一些你不知道的事情.

您已经将ClassInterface(ClassInterfaceType.None)属性应用于该类。这告诉COM互操作不要为类定义显式接口,因此您的客户端必须使用IDispatch (后期绑定)。这意味着客户端必须对类实现的接口具有先验知识。也就是说,您(程序员)知道有哪些方法可用,但是像IntelliSense这样的工具无法找到这些信息。

只需继续调用该方法:

代码语言:javascript
复制
Dim response As String
response = arcom.GetServiceResponse
票数 2
EN

Stack Overflow用户

发布于 2011-04-27 22:38:02

好吧,我发现了一些出乎意料的改变。

注意,上面的代码包含装饰ComVisible(true)。当然,使组件对COM可见是必要的。我以为这包括了它,但经过进一步的搜索,我发现有另一个地方可以标记它。如果您查看项目属性,在应用程序选项卡中,您将找到程序集信息.按钮。单击它,在对话框的底部,您将看到一个复选框“visible”。我检查了它,重新编译(并重新运行tlbexp和regasm),然后发现GetServiceResponse()方法是可见的。

我不知道为什么当设置属性时make ComVisible复选框不能工作。

编辑补充道:,我想我看到了这是怎么回事。ComVisible(true)使类对COM可见,而不使程序集可见;这就是为什么需要检查“使程序集COM-可见”的原因,因为GetServiceResponse方法似乎通过ARCOM_Interface获得了它的COM-可见性,除非程序集也被标记为ComVisible。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5811119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档