强制VB6编译器在调用.NET COM DLL时使用早期绑定

4

我有一个用C#编写的COM DLL,运行Regasm后,我可以从VB6中调用这个DLL,引用COM DLL。在VB6中,我可以使用Intellisense。

但是,当我按F5编译时,编译器没有捕获调用COM DLL时的任何错误。它必须使用后期绑定。

如何让它使用早期绑定?

接口已声明。

using System.Runtime.InteropServices;   
namespace combridge    
{
[Guid("2f4b6041-91e3-4d9f-a9f5-9bd4adfd1789")]  
[ComVisible(true)]  
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IBridge    
     {
      // methods go here
     }    
  }

主类已声明。
[Guid("085777fa-9397-4cfd-843a-85ececb86789")]
[ProgId("companyname.ComBridge")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class BridgeImplementation : IBridge
{
    #region Public Implementation

    [DispId(1)]
    [ComVisible(true)]
    public string EchoTest(string message)
    {
        return string.Format("Echo '{0}' at {1:T}", message, DateTime.Now);
    }

 // etc

[更新]

在VB6项目中,我引用了我创建的tlb文件,使用方法如下:

c:\WINDOWS\Microsoft.Net\Framework\v4.0.30319/regasm /verbose /codebase /tlb:CommBridge.tlb ComBridge.dll 

在VB6中,我使用以下方式创建对象:
Dim o As BridgeImplementation
Set o = New BridgeImplementation
o.EchoTest  // executes
o.NonExistantFunction // run time error

由于某种原因,您在 IBridge 接口上缺少 nonextensible 属性。VB6 客户端肯定没有对已识别的方法使用迟绑定。缺少 nonextensible 允许客户端通过 IDispatch 接口调用具有自定义名称的方法。这些方法的 名称 不是在编译时知道的。(例如,ADO.Connection 可以将存储过程作为 conn 对象的方法执行)。请检查 OLE View 中的 IDL 源转储或在此处发布它。 - wqw
1个回答

1
在接口声明上方,我替换了


[InterfaceType(ComInterfaceType.InterfaceIsDual)]

带着。
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

并且它解决了问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接