对COM对象使用.NET包装器:不能像方法一样使用不可调用的成员

时间:2016-06-24 08:55:37

标签: c# .net com activex com-interop

我需要一些方法在.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包装器并且我可以调用方法。那为什么它现在不起作用呢?

0 个答案:

没有答案