4

I have a com dll written in c# After running Regasm I can call this dll from VB6, referencing the com dll. In VB6 I have intellisense available.

However when I press F5 to compile the compiler does not catch any mistakes in calling the com dll. It must be using late binding.

How can I get it to use early binding?

The interface is declared

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

The main class is declared

[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

[update]

In the VB6 project I reference the tlb file which I create using

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

In the VB6 I create the object using

Dim o As BridgeImplementation
Set o = New BridgeImplementation
o.EchoTest  // executes
o.NonExistantFunction // run time error
Deanna
  • 23,876
  • 7
  • 71
  • 156
Kirsten
  • 15,730
  • 41
  • 179
  • 318
  • You are missing `nonextensible` attribute on the `IBridge` interface for some reason. VB6 client is not using late-bound on recognized methods for sure. Missing `nonextensible` allows clients to call methods with custom names through `IDispatch` interface. These method *names* are not known at compile time. (e.g. `ADO.Connection` can execute stored procedures as methods on the conn object). Check IDL source dump from `OLE View` or post it here. – wqw Aug 28 '14 at 15:00

1 Answers1

1

Above the interface declaration I replaced

[InterfaceType(ComInterfaceType.InterfaceIsDual)]

with

[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

and it solved the problem

Kirsten
  • 15,730
  • 41
  • 179
  • 318