我需要一些方法在.NET(C#)中使用ActiveX组件。我知道can be done使用动态对象。但我想使用由VS 2015或TlbImp.exe生成的类型化包装器(Runtime Callable Wrapper)。我尝试过这样使用它:
var connector = new Connector(); // Connector is _interface_ with CoClass attribute applied. Yep, it works
connector.Login(connStr, flags); // compile-time error
可以成功创建连接器对象,但由于编译时错误,我无法调用Login
方法:CS1955 Non-invocable member 'IConnector.Login[string, int]' cannot be used like a method.
自动生成的包装器看起来像这样(通过IL Spy):
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"), TypeLibType(TypeLibTypeFlags.FDual | TypeLibTypeFlags.FDispatchable)]
[ComImport]
public interface IConnector
{
[DispId(201)]
int Login
{
[DispId(201)]
[MethodImpl(MethodImplOptions.InternalCall)]
get;
}
...
}
[CoClass(typeof(ConnectorClass)), Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
[ComImport]
public interface Connector : IConnector
{
// nothing here
}
[ClassInterface(ClassInterfaceType.None), Guid("yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"), TypeLibType(TypeLibTypeFlags.FCanCreate)]
[ComImport]
public class ConnectorClass : IConnector, Connector
{
[DispId(201)]
public virtual extern int Login
{
[DispId(201)]
[MethodImpl(MethodImplOptions.InternalCall)]
get;
}
...
}
注意:从VBScript成功调用此ActiveX组件。此外,我尝试以相同的方式为中的其他随机COM组件生成.NET包装器并且我可以调用方法。那为什么它现在不起作用呢?