我有一个用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