Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将一个COM类实例作为参数传递给C#中的另一个COM方法?_C#_.net_Com_Com Interop_Tlbimp - Fatal编程技术网

如何将一个COM类实例作为参数传递给C#中的另一个COM方法?

如何将一个COM类实例作为参数传递给C#中的另一个COM方法?,c#,.net,com,com-interop,tlbimp,C#,.net,Com,Com Interop,Tlbimp,我使用TlbImp.exe为2个COM DLL创建了一个包装器。 有一个类被包装器描述为 using System; using System.Runtime.InteropServices; namespace GNOTDRSIGNATURESERVERLib { [CoClass(typeof(GNOTDRSignatureServerClass)), Guid("20CBF9E0-06BF-11D3-97B5-0080C878CFFA")] public

我使用
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并使用
gnotdrsignatoreserver
而不是
UnmanagedType.IUnknown
,或者我可以使用
System.Runtime.InteropServices.Marshal.GetComInterfaceForObject


我的代码怎么了?

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


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

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