[quote=引用 9 楼 Saleayas 的回复:] 首先按照你的接口定义方法定义一个带布局的接口,其成员为接口方法的委托。 委托必须和接口中的方法一致。(这就是虚表) 然后,定义一个托管版的接口。这个接口自己定义,怎样都可以,只要语义一致就可以。 这个接口将暴露给你的使用者。 定义一个数据结构,实现托管版的接口。在这个数据结构中保存两个数据, 1、 void Get(IInterface** pInterface); 获取的接口。(定义为 IntPtr) 2、根据接口获取其指向的虚表,并转换为托管版的那个带布局的接口。(PtrToStruct 必须使用接口指向的虚表,不能直接用接口做参数)。 实现每一个托管版的接口就可以了。 如果,简单一点, 不需要实现那个带布局的接口。 你可以直接根据接口,获取虚表,进而或者指定的方法的指针,然后转换为托管的委托,然后,直接使用这个委托来呼叫。
首先按照你的接口定义方法定义一个带布局的接口,其成员为接口方法的委托。 委托必须和接口中的方法一致。(这就是虚表) 然后,定义一个托管版的接口。这个接口自己定义,怎样都可以,只要语义一致就可以。 这个接口将暴露给你的使用者。 定义一个数据结构,实现托管版的接口。在这个数据结构中保存两个数据, 1、 void Get(IInterface** pInterface); 获取的接口。(定义为 IntPtr) 2、根据接口获取其指向的虚表,并转换为托管版的那个带布局的接口。(PtrToStruct 必须使用接口指向的虚表,不能直接用接口做参数)。 实现每一个托管版的接口就可以了。 如果,简单一点, 不需要实现那个带布局的接口。 你可以直接根据接口,获取虚表,进而或者指定的方法的指针,然后转换为托管的委托,然后,直接使用这个委托来呼叫。
[quote=引用 2 楼 mjp1234airen4385 的回复:] void Get(IInterface** pInterface); IInterface*这是个对象指针,在C#里你定义一个同样的对象就可以了,直接使用IntPtr。 IInterface interf = new IInterface (); 把interf转换成指针,把指针pinterf传入, Get(pinterf); 得到pinterf后,再转换回去。 int size = Marshal.SizeOf(interf); IntPtr pinterf = Marshal.AllocHGlobal(size); try { Marshal.StructureToPtr(interf, pinterf, false); } finally { Marshal.FreeHGlobal(buffer); } 试试这个方法行不行
[ComVisible(true)] [Guid("E40223B3-DE70-4109-ADED-92A394618778")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 首先确定你的 DLL 是否只 COM 。 如果是,可以注册后,直接导入。 C# 对 COM 有完成的包装。 可以当作托管的 DLL 直接使用。 如果不是 COM 的。那么需要自己主动导出 接口 和相关的函数。 你可以在 C# 里面模拟虚表。 如果,觉得这个很麻烦,可以使用 C++/CLI 建立一个中间 DLL 。
void Get(IInterface** pInterface); IInterface*这是个对象指针,在C#里你定义一个同样的对象就可以了,直接使用IntPtr。 IInterface interf = new IInterface (); 把interf转换成指针,把指针pinterf传入, Get(pinterf); 得到pinterf后,再转换回去。 int size = Marshal.SizeOf(interf); IntPtr pinterf = Marshal.AllocHGlobal(size); try { Marshal.StructureToPtr(interf, pinterf, false); } finally { Marshal.FreeHGlobal(buffer); } 试试这个方法行不行
110,536
社区成员
642,578
社区内容
加载中
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧