gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:26:41 25 4
gpt4 key购买 nike

我使用 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

我的代码有什么问题?

最佳答案

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

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

关于c# - 如何将一个 COM 类实例作为参数传递给 C# 中的另一个 COM 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9113101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com