C#和com for vb6

时间:2010-05-07 07:29:07

标签: c# com vb6

我遇到了C#和COM的问题。 :(

[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组件无法创建对象?

4 个答案:

答案 0 :(得分:1)

您是否勾选了项目属性中的“注册COM互操作”框?

答案 1 :(得分:1)

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

是否在运行VB代码的机器上的注册表中正确注册了C#组件?请参阅Paolo的答案,了解VisualStudio在您使用regasm.exe工具自行构建和/或注册时为您执行此操作的方法。对于“真正的”COM对象,此工具等效于regsrv32.exe,但随后在注册表中注册一个适当构建的.NET程序集,以便从COM中使用。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果程序集未在GAC中注册,则必须使用regasm的{​​{1}}开关。