托管和非托管 C++/MFC 可以混合在一个 dll 中吗?

Posted

技术标签:

【中文标题】托管和非托管 C++/MFC 可以混合在一个 dll 中吗?【英文标题】:Can managed and unmanaged C++/MFC be mixed in one dll? 【发布时间】:2011-03-02 10:17:02 【问题描述】:

以前我们在 MFC (VC6)、VB6 和 C# 应用程序中的软件需要调用用 C++(和 MFC)编写的相同引擎。引擎需要 C++ 来提高速度。当时我们决定使用 COM 作为接口,因为这三个都可以在编组等问题最少的情况下使用它。

我们的 MFC 应用程序现已弃用,我们最近决定转储 VB6,所以剩下的就是 C#。

我们可以让 COM 引擎保持原样,但最好摆脱 COM 注册等,并拥有一个可使用的托管接口。如果此人的机器出现问题,COM 注册有时会导致支持问题。

是否可以有一个包含现有非托管 C++/MFC 和 .NET 前端接口的 dll?

【问题讨论】:

【参考方案1】:

C++/CLI 两者都可以。

【讨论】:

【参考方案2】:

您可以拥有一个在内部使用 MFC 类的 C++/CLI DLL。使用 C++/CLI 创建混合模式 DLL 的一个很好的优势是,您几乎可以在 DLL 中的任何位置使用本机 C++(遵循 C++/CLI 规则)并且“它可以正常工作”。

然而,这里的目标应该是提供可以从 C# 应用程序调用的漂亮、干净、托管的包装器。

话虽如此 - 您很可能希望避免将 MFC 用于任何用户界面元素。尽管可以在 C# 中托管 MFC 内容,反之亦然,但这通常会出现问题 - 最好使用 C++/CLI 将 C++ 引擎(时间关键操作)和遗留代码封装在漂亮、干净的托管包装器中。

【讨论】:

这里没有 MFC 中的用户界面。我们主要使用 CString 和 CStringArray,偶尔使用 CArray。你知道有什么好的教程吗? functionx.com/cppcli/index.htm - 在大多数情况下,一旦你学习了“CLI”部分,它就与 C++ 的 MFC 问题相同...... 我实际上想知道更多关于实际问题的信息 - 我应该创建一个 MFC dll 并添加 /clr 还是创建一个类库并标记非托管代码等。也感谢该链接。

以上是关于托管和非托管 C++/MFC 可以混合在一个 dll 中吗?的主要内容,如果未能解决你的问题,请参考以下文章

运行使用 /clr 构建的 DLL 的本机 C++ 应用程序时访问冲突

如何在托管 (C#) 和非托管 (C++) 代码之间来回传递数组内容

将非托管 C++ dll 添加到托管 C++ dll

从非托管 C++ mfc active x dll 启动 C# 对话框

托管和非托管的c++是啥意思,有啥区别?

从 C# 调用非托管 C++ VS 6.0 MFC dll