我有一个 ActiveX 控件(用 C++ 编写)并从 C# 项目中引用它的 RCW 程序集(由 aximp.exe 创建)。
在实现 Ax 控件的 C++ 代码中,我有一个实现接口的类,该接口作为 Ax 控件的属性公开。
查看生成的 RCW 程序集,我看到了界面。我可以尝试声明其类型的变量。
现在,如果我只有一个指向在内存中实现接口的 C++ 类实例的指针,是否可以使用该指针将其数据编组到表示接口的托管 C# 对象中?
请注意,它不是接口指针。它是指向我拥有的类的实例的指针。
我有一个 ActiveX 控件(用 C++ 编写)并从 C# 项目中引用它的 RCW 程序集(由 aximp.exe 创建)。
在实现 Ax 控件的 C++ 代码中,我有一个实现接口的类,该接口作为 Ax 控件的属性公开。
查看生成的 RCW 程序集,我看到了界面。我可以尝试声明其类型的变量。
现在,如果我只有一个指向在内存中实现接口的 C++ 类实例的指针,是否可以使用该指针将其数据编组到表示接口的托管 C# 对象中?
请注意,它不是接口指针。它是指向我拥有的类的实例的指针。
您可能想尝试一下 C++ / CLI。编写在 C++ 和 C# 之间进行互操作的代码是一件轻而易举的事。
我认为这里有两个问题。
是的。这可以通过在 C# 应用程序中实现 COM 接口,然后将“this”作为参数之一传递来实现。接受“this”指针的托管类型应该是 Int32 或 Int64(无符号 OK),具体取决于您的平台
是和否。
您不能直接在此指针上调用任何实例方法,因为没有可以将值转换为的类型。所以它不能像使用 COM 接口那样使用。
您可以做的是在您的本机应用程序中定义一组外部“C”方法,这些方法将该类型的指针作为第一个参数,然后在该对象上调用特定方法。然后,您可以使用 C# PInvoke 进入该方法
C++
void SomeType_SomeMethod(SomeType* pSomeType) {
pSomeType->SomeMethod();
}
C#
[DllImport("YourDll.dll")]
public static extern void SomeType_SomeMethod(IntPtr pSomeType);