我有一个最初用 MSVC++ 6.0 编写的非托管 C++ DLL。它有几个类和一些独立的 C 函数,我需要从 C# .NET 4.0 调用它们。我在这方面有过几次错误的开始。我知道有几种方法可以做到这一点(转换为 COM、MC++ 包装器、PInvoke),但尚不清楚哪种方法最直接。我目前的方法是将 C++ DLL 转换为 ActiveX 控件。我遇到的问题是,当尝试在 VS 2010 C++ ActiveX 项目中重新创建方法时,类向导不允许任何返回类型,除了基本类型、CString 或指向 CWnd 的指针。如何返回结构的副本或指向结构的指针?它没有
问问题
976 次
1 回答
0
您不应该将非托管数据返回到托管代码(或任何代码)。如果您的 ActiveX 类正在分配此内存,则您的 ActiveX 类负责取消分配。
解决这个问题的一个常用方法是有一个方法返回一个 HRESULT 并接收具有数据大小的原始数据,或者如果你想要更托管的东西,它可以接收一个安全的字节数组(这可以映射到字节[] 在托管代码中)。
在您的方法实现中,您可以用结构的数据覆盖数组。
回到托管代码中,您需要将结构编组为字节数组,以便将其传递给您的新方法。Marshal.StructureToPtr方法可能有助于此任务。
为了给你的类添加一个接收指针作为参数的方法,你可以使用你的activex控件默认界面的“添加方法”上下文菜单选项。见下图:
于 2012-05-11T19:29:29.343 回答