我遇到了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组件无法创建对象?
答案 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}}开关。