我试图看看我是否可以在C# (.NET 4)中构建一个COM组件,我可以通过VB5程序使用它来访问web服务。按照我在MSDN和CodeProject上找到的所有说明,如下所示:
我写了以下几封信:
[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代码中执行以下操作:
Private Sub HitWebService()
Dim arcom As ARCOMObject.ARCOM_Class
arcom. <== Intellisense doesn't sense anything!
End SubIntellisense可以看到ARCOMObject和类,但是除了通常的"GetType“、"Equals”和其他泛型对象方法/属性之外,ARCOM_Class本身中没有任何内容。更具体地说,它似乎没有看到GetServiceResponse()方法,所以我不能调用它。
我漏掉了什么?
发布于 2011-04-27 22:40:31
我看到你想办法得到你想要的,而我正在输入这个回复,但我还是会继续,因为它可能告诉你一些你不知道的事情.
您已经将ClassInterface(ClassInterfaceType.None)属性应用于该类。这告诉COM互操作不要为类定义显式接口,因此您的客户端必须使用IDispatch (后期绑定)。这意味着客户端必须对类实现的接口具有先验知识。也就是说,您(程序员)知道有哪些方法可用,但是像IntelliSense这样的工具无法找到这些信息。
只需继续调用该方法:
Dim response As String
response = arcom.GetServiceResponse发布于 2011-04-27 22:38:02
好吧,我发现了一些出乎意料的改变。
注意,上面的代码包含装饰ComVisible(true)。当然,使组件对COM可见是必要的。我以为这包括了它,但经过进一步的搜索,我发现有另一个地方可以标记它。如果您查看项目属性,在应用程序选项卡中,您将找到程序集信息.按钮。单击它,在对话框的底部,您将看到一个复选框“visible”。我检查了它,重新编译(并重新运行tlbexp和regasm),然后发现GetServiceResponse()方法是可见的。
我不知道为什么当设置属性时make ComVisible复选框不能工作。
编辑补充道:,我想我看到了这是怎么回事。ComVisible(true)使类对COM可见,而不使程序集可见;这就是为什么需要检查“使程序集COM-可见”的原因,因为GetServiceResponse方法似乎通过ARCOM_Interface获得了它的COM-可见性,除非程序集也被标记为ComVisible。
https://stackoverflow.com/questions/5811119
复制相似问题