非托管 vc++ 静态库和 C# GUI 应用程序
Posted
技术标签:
【中文标题】非托管 vc++ 静态库和 C# GUI 应用程序【英文标题】:Unmanaged vc++ static libraries and C# GUI app 【发布时间】:2008-10-07 14:25:21 【问题描述】:基本上我有一堆非托管的 VC++ 静态库。而使用这些的 VC++ GUI 应用程序是基于 MFC 的。 目标是用 C# 中完成的 GUI 应用程序替换 GUI 应用程序,但使用所有相同的静态库。 问题是这是否可能,如果是,那么实现这一目标的正确方法是什么?
建议,有人吗? 谢谢。
【问题讨论】:
【参考方案1】:是的,可以将 C++/CLI 用于托管 C++ 代码。您将编写一个 C++/CLI WinForms 应用程序,并按照正常方式简单地链接到您的静态库中。
但是,如果 GUI 代码和库之间存在很多紧密耦合,那么这可能会变得有点混乱。您将需要担心在托管和非托管世界之间转换某些数据类型,尤其是字符串。如果您需要传递托管对象/数组
Wikipedia 上有很好的介绍,MSDN 上有很多文档。
【讨论】:
诀窍还在于 GUI 应用程序必须从这些静态库中扩展一些对象,以便能够对从库中调用的一些回调方法作出反应。这行得通吗? 托管类不能直接从非托管类继承,但您可以在应用中实现从库类继承的非托管类并充当托管类的代理【参考方案2】:Rob 是正确的 - 您可以完全在 C++/CLI 中执行此操作,但我们发现将一些本机类包装在托管的 WinForms 用户控件类中最有用。这个托管类包含本机类的一个实例,不仅在方法调用中编组数据(如字符串),而且还将本机回调(使用 boost::signal 实现)转换为 .NET 事件。这个信号事件转换的整个解决方案在this question 中有详细说明。 .NET WinForms 用户控件还捕获本机异常并将它们作为托管异常重新抛出,并将非 .NET 接口(返回迭代器的方法)转换为更 .NET 风格的接口,您可以在this question。然后,我们可以直接在 WPF 应用程序中使用 .NET 类。请注意,如果将其包装为 .NET 类,则必须放入 DLL 中才能从 C# 中使用。
【讨论】:
以上是关于非托管 vc++ 静态库和 C# GUI 应用程序的主要内容,如果未能解决你的问题,请参考以下文章