C#和com vb6

问题描述:

我有一个C#和COM的问题。 :(C#和com vb6

[Guid("f7d936ba-d816-48d2-9bfc-c18be6873b4d")] 
[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.None)] 
public class Process : IProcess 
{ 

    public Process() 
    { 
    } 

    public int UpdateBalance(string accountNumber, string adminEventDescription, decimal curAmount) 
    { 
     return 10; 
    } 
} 

[ComVisible(true)] 
[Guid("5c640a0f-0dce-47d4-87df-07cee3b9a1f9")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface IProcess 
{ 
    int UpdateBalance(string accountNumber, string adminEventDescription, decimal curAmount); 
} 

而VB代码

Private Sub Command1_Click() 
    Dim test As Object 
    Set test = New Forwardslash_PlayerTrackingSystem_Api.Process 
End Sub 

我得到以下

ActiveX组件不能创建对象?

你有没有打勾的 “注册为COM Interop”在项目属性框?

+0

是的,我做了:)但它不能正常工作:) – 2010-05-07 08:20:04

你有ProgID还定义了C#源代码中的?您的示例代码似乎没有包含它。 (或者你是否正在使用现有的类型库,并以某种方式通过GUID在VB中创建对象?)

而且是在VB代码运行的计算机上的注册表中正确注册的C#组件?当您使用regasm.exe工具自行构建和/或注册时,请参阅Paolo的答案,让VisualStudio为您做到这一点。此工具相当于“真实”COM对象的regsrv32.exe,但是随后在注册表中注册了适当构建的.NET程序集以供COM使用。

+0

如果我在本地机器上执行regasm,那么会出现自动化错误。那说 系统找不到指定的文件 – 2010-05-07 08:16:20

+1

@Jim“系统找不到指定的文件” 2010-05-07 08:59:23

您的[接口类型]属性是错误的。 VB6需要一个IDispatch接口,它不能处理一个IUnknown接口。它最喜欢ComInterfaceType.InterfaceIsDual,它生成一个完整的类型库,在VB6编辑器中启用IntelliSense,比后期绑定的IDispatch快大约1000倍。

使用regasm/codebase如果程序集未在GAC中注册,则必须使用开关。