Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用跨平台C++;使用WPF C#GUI_C#_C++_Cross Platform - Fatal编程技术网

如何使用跨平台C++;使用WPF C#GUI

如何使用跨平台C++;使用WPF C#GUI,c#,c++,cross-platform,C#,C++,Cross Platform,我目前在一个项目中,需要在Mac和Windows上工作。对于所有的应用逻辑,我们使用标准的便携式C++。然而,由于我们希望应用程序在这两个平台上都能感觉完全是本地的,GUI将使用C#/WPF(适用于Windows)和Objective-C/Cocoa(适用于Mac)编写 但是,对于Windows部分,我想知道用C语言来使用C++代码的最佳方法是什么。C是管理的,我知道我们也可以使用托管C++。但是我担心在CLR中使用C++可能会引入意外的bug,或者我们需要在C++代码中到处放置大量的μiIFD

我目前在一个项目中,需要在Mac和Windows上工作。对于所有的应用逻辑,我们使用标准的便携式C++。然而,由于我们希望应用程序在这两个平台上都能感觉完全是本地的,GUI将使用C#/WPF(适用于Windows)和Objective-C/Cocoa(适用于Mac)编写

但是,对于Windows部分,我想知道用C语言来使用C++代码的最佳方法是什么。C是管理的,我知道我们也可以使用托管C++。但是我担心在CLR中使用C++可能会引入意外的bug,或者我们需要在C++代码中到处放置大量的μiIFDEF Win32,使之与管理的CLR和Mac OS X的非托管环境一起工作(注意我们确实希望放一些IFDEF,但是如果可能的话,我们希望保持它的控制)。所以,基本上,使用C++代码和C++代码的最佳方式是什么?现在,我正在考虑三种解决方案

< 1 >将C++编译为C++/CLI,直接使用C语言中的类和函数。

2编译并将C++封装到一个非托管Win32 DLL中,并使用DLLimPosiv/P>从C调用它。

3——将COC++打包在COM包装器中,并使用.NETCOM互操作将其与C<< /P>链接起来。


哪种方法最好?或者,如果有更好的解决方案,它是什么?

C++ +CLI对标准C++有几个限制,但并不总是容易将标准C++重新编译为C++/CLI。请记住,首先您必须区分“托管”和“非托管”指针。因为它们使用了不同的符号,所以您的第一组ifdef就在那里。然后你就可以学习ref和value类,以及所有那些有趣的东西

但是,您可以使用C++/CLI来弥合本机代码与.NET世界之间的鸿沟。上次我按照您的计划做了一些事情时,我使用C++/CLI编写了桥接层,它在.NET类型和类与本机世界之间执行了必要的转换和转换工作。显然,C++/CLI层可以从任何.NET语言使用

您不能总是使用(2)-这在很大程度上取决于您试图在两个世界之间交换的数据类型。NET编组代码非常擅长处理C POD,但如果处理得更复杂,您就会遇到问题


(3) 是过度杀戮IMHO并引入另一个失败点,另外,如果您创建了自己的桥接代码,那么您将使用.NET COM本机而不是更简单的.NET本机。更不用说,你增加了代码的复杂性,这将不利于你正在瞄准的其他OS,即OS x.< /p> C++ +CLI,对标准C++有一些限制,但并不总是容易将标准C++重新编译为C++/CLI。请记住,首先您必须区分“托管”和“非托管”指针。因为它们使用了不同的符号,所以您的第一组ifdef就在那里。然后你就可以学习ref和value类,以及所有那些有趣的东西

但是,您可以使用C++/CLI来弥合本机代码与.NET世界之间的鸿沟。上次我按照您的计划做了一些事情时,我使用C++/CLI编写了桥接层,它在.NET类型和类与本机世界之间执行了必要的转换和转换工作。显然,C++/CLI层可以从任何.NET语言使用

您不能总是使用(2)-这在很大程度上取决于您试图在两个世界之间交换的数据类型。NET编组代码非常擅长处理C POD,但如果处理得更复杂,您就会遇到问题


(3) 是过度杀戮IMHO并引入另一个失败点,另外,如果您创建了自己的桥接代码,那么您将使用.NET COM本机而不是更简单的.NET本机。更不用说,您的代码增加了复杂性,这对您所针对的其他操作系统(即OS X)没有好处。

我们的开发团队已经在ASP.NET和WPF前端使用了C++/CLI编译代码

我们遇到的第一个主要问题是构建时间。代码库将是150k行(40多个项目),链接需要花费很长时间(由于链接器问题,我们无法将单个项目构建为DLL)。我们只能通过用托管C++类封装代码并将项目作为程序集来解决这个问题。

第二个主要问题是绩效。我们最初编译了/CLR(在纯选项存在之前),这导致了我们在托管C++层中发生的大部分调用的双中继。我们通过切换到/clr:pure解决了这个问题。这样我们就遇到了一个麻烦
程序集中的“全局”方法太多,因此无法加载。为了解决这个问题,我们不得不进一步拆分程序集。

我们的开发团队已经在ASP.NET和WPF前端使用了C++/CLI编译代码

我们遇到的第一个主要问题是构建时间。代码库将是150k行(40多个项目),链接需要花费很长时间(由于链接器问题,我们无法将单个项目构建为DLL)。我们只能通过用托管C++类封装代码并将项目作为程序集来解决这个问题。

第二个主要问题是绩效。我们最初编译了/CLR(在纯选项存在之前),这导致了我们在托管C++层中发生的大部分调用的双中继。我们通过切换到/clr:pure解决了这个问题。这样我们就遇到了一个麻烦
程序集中的“全局”方法太多,因此无法加载。我们必须进一步拆分程序集以解决此问题。

最好且更简单的方法是使用.NET COM,因为COM与.NET内部的本机dll访问相比具有更强的桥接,因为它可能会导致大量内存问题和大量故障排除时间。在任何MFC项目中测试COM和获取跟踪都比较容易