【问题标题】:How to pass one COM class instance as a parameter to another COM method in C#?如何将一个 COM 类实例作为参数传递给 C# 中的另一个 COM 方法?
【发布时间】:2012-02-25 03:40:23
【问题描述】:

我使用TlbImp.exe 为 2 个 COM DLL 创建了一个包装器。 有一个类,包装器描述为

using System;
using System.Runtime.InteropServices;

namespace GNOTDRSIGNATURESERVERLib
{
    [CoClass(typeof(GNOTDRSignatureServerClass)),
        Guid("20CBF9E0-06BF-11D3-97B5-0080C878CFFA")]
    public interface GNOTDRSignatureServer
    {
    }
}

这个对象必须作为参数传递

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

namespace GN8000Lib
{
    [TypeLibType(2),
         ClassInterface(0), 
         ComSourceInterfaces("GN8000Lib._I8000Events\0"),
         Guid("DCAD84FE-43A8-11D3-B1A2-005004131886")]
    public class GN8000Class : I8000
    {
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern GN8000Class();

        [DispId(6)]
        [MethodImpl(MethodImplOptions.InternalCall)]
        void I8000.Initialize(
            [IUnknownConstant] [MarshalAs(UnmanagedType.IUnknown)] [In]
            object pSigServer = null);
    }
}

然后我这样调用方法:

var gn8000 = new GN8000();
var signatureServer = new GNOTDRSignatureServer();
gn8000.Initialize(signatureServer);

我认为正在传递的对象不是正确的。我觉得TlbImp.exe 可以链接那些DLL 并使用GNOTDRSignatureServer 而不是UnmanagedType.IUnknown,或者我可以使用System.Runtime.InteropServices.Marshal.GetComInterfaceForObject

我的代码有什么问题?

【问题讨论】:

  • 您遇到的错误是什么?另外,我在接口上看不到任何方法声明。你确定这是正确的签名吗?
  • @casperOne 我得到的错误是对象必须交互,就像它们在我用作指南的示例 VBScript 代码中所做的那样,而它们在 C# 中没有。我在发布之前从界面中删除了一些方法,因为它们与这个问题无关。

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


【解决方案1】:

声明看起来很丑陋,我假设它们是由某种逆向工程工具生成的,并且不是您自己编写的。在这种情况下,拥有一个空接口并不少见。 COM 中的等价物是 dispinterface,该接口仅支持通过 IDispatch 进行后期绑定。这是相当普遍的,COM 服务器可能被设计为使用脚本语言、只支持后期绑定的运行时环境。与 .NET 中的 ComInterfaceType.InterfaceIsIDispatch 相同。 [DispId] 对于后期绑定很重要,通过号码而不是名称调用。

这也使参数类型易于解释。脚本语言使用 VARIANT 作为其变量类型。与您在 C# 代码中声明为 object 的变量非常相似,它可以存储任何值。功能,而不是错误。

【讨论】:

  • 是的,上面的代码是由TlbImp.exe生成的。我在发布之前从界面中删除了一些方法,因为它们与这个问题无关。
猜你喜欢
  • 2016-06-26
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 2018-01-23
相关资源
最近更新 更多