【发布时间】: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