通过 P/Invoke 将 MFC CArray 编组为 C#

Posted

技术标签:

【中文标题】通过 P/Invoke 将 MFC CArray 编组为 C#【英文标题】:Marshalling an MFC CArray to C# through P/Invoke 【发布时间】:2011-07-01 18:27:15 【问题描述】:

我正在尝试编写一个允许使用旧版 C++ dll 中包含的函数的 C# 类 (2010)。这些函数使用 __stdcall 导出,并具有不同的参数集。我处理字符串和其他原语没有问题,并且能够毫无问题地调用这些函数。

问题是一些函数包含一个 CArray & 引用作为参数。我不知道如何编组这种数据类型,或者是否有可能。

很遗憾,我无法更改旧版 DLL 代码。

【问题讨论】:

【参考方案1】:

要正确处理这个问题,您可以制作一个包装 DLL(使用与您要调用的相同的 MFC/C++ 运行时版本,并确保接受相同的数组,例如传统指针本机 C++ 数组。

可以从 C# 调用此包装 DLL。

您可以尝试使用更新的 MFC 版本(并使用 C++/CLI 进行编组),但是新的 CArray 可能与旧库所期望的二进制不兼容。

【讨论】:

你能给我看一个代码示例吗,或者可以给我一个解释如何构造包装类的资源?我以前从未涉足过这个领域。谢谢! 使用什么 MFC 版本开发旧版 C++ dll?包装器必须是相同的版本。 它是 MFC90。我搜索了代码示例,我只能找到一些类包装器,其中本机代码项目作为解决方案的一部分包含在内。这里不是这种情况。在这里,我有一个静态 DLL,导出函数(不是类)。我得到了要做什么的要点——基本上用 C++ 调用函数并使用托管数据类型导出结果。问题是我不知道如何启动项目! 哦,我可以访问头文件和 .lib 文件。它不是 COM DLL。 哦,那应该很容易。一步一步来。我假设 mfc 有 dll 链接。首先在项目设置中启用 mfc 和 .net 在 vs 2008 中创建一个新的 dll。这些是标准的向导选项。接下来将其链接到您的旧版 dll。只需添加一个创建空 CArray 并调用您的本机代码的函数(非托管 c++)。如果你得到这个链接,你就准备好添加一个托管的 c++ 类,带有一个没有参数的静态 fn。签入从 .net 调用时实际到达的调试器。不要担心混合 3.5/4.0,这是以后的问题。在此处报告以获取更多说明。

以上是关于通过 P/Invoke 将 MFC CArray 编组为 C#的主要内容,如果未能解决你的问题,请参考以下文章

MFC CArray类的基本使用

在 MFC CArray 中,使用不同默认模板类型的原因是啥?

仅将 CString 和 CArray 包含到 C++ 项目中

CArray 和内存预分配

通过 P/Invoke 调用 GetGUIThreadInfo

我应该如何使用 P/Invoke 将字符串数组传递给 C 库?