C++ 与 C++.NET 之间的主要区别是啥? [复制]
Posted
技术标签:
【中文标题】C++ 与 C++.NET 之间的主要区别是啥? [复制]【英文标题】:What is the main difference between C++ vs C++.NET? [duplicate]C++ 与 C++.NET 之间的主要区别是什么? [复制] 【发布时间】:2012-01-03 10:07:11 【问题描述】:可能重复: What is the difference between Managed C++ and C++/CLI? What is CLI/C++ exactly? How does it differ to 'normal' c++?
我怀疑区分 C++ 和 C++.NET。
是不是 C++ 是非托管代码而 C++.NET 是托管代码?
我需要用 C++ 为一个项目编程。为了更好地构建 GUI,我更喜欢使用 C++.NET。
我还有一个普通的 C++ 库(非托管 C++ DLL 文件),是否可以将它用作 C++.NET 项目中的普通 DLL 库?
【问题讨论】:
【参考方案1】:对吗,C++ 是非托管代码,而 C++.NET 是托管代码。
没有“C++.NET”这样的东西。有 C++/CLI,它基本上是带有 Microsoft 扩展的 C++,允许您编写针对 .NET 框架的代码。 C++/CLI 代码编译为 CLR 字节码,并像 C# 一样在虚拟机上运行。我假设您实际上是在谈论 C++/CLI。
关于这一点,可以说标准 C++ 是非托管的,而 C++/CLI 是托管的,但这在很大程度上是 Microsoft 的术语。在谈论标准 C++ 时,您永远不会看到以这种方式使用“非托管”一词,除非与 C++/CLI 进行比较。
标准 C++ 和 C++/CLI 都可以由同一个 Visual C++ 编译器编译。前者是 VC++ 编译器的默认设置,而后者需要编译器开关才能编译。
我需要用 C++ 为一个项目编程。为了更好地构建 GUI,我 更喜欢使用 C++.NET。
您可以使用 C++ 以及 C++/CLI 构建 GUI 程序。这更难,因为标准 C++ 中没有像 .NET 框架那样构建 GUI 的标准库,但是有很多项目,如 Qt 和 wxWidgets,它们提供了 C++ GUI 框架。
我还有另一个纯 C++ 库(非托管 C++ dll),可以吗? 是否可以将其用作 C++.NET 项目中的普通 dll 库?
是的。处理不同的标准 C++ 数据类型和 .NET 数据类型可能需要一些额外的工作,但您当然可以让它工作。
【讨论】:
感谢您的快速回答。如果是这样,我应该在 Visual Studio 中使用 C++/CLI 来构建 GUI,而不是使用 QT 或 wxWidgets?因为使用 QT 或 wxWidgets,我引入了我的应用程序的另一个依赖项。我想如果我只使用 C++/CLI 托管,我只需要拥有 .net 框架。使用 C++/CLI、QT 和 wxWidgets 的优缺点是什么?你能帮我澄清一下吗?提前致谢。 @devn:.NET 框架也是一个比 Qt 或 wxWidgets 更大的依赖项,所以无论如何你都需要一个依赖项。请注意,Qt 和 wxWidgets 不需要 .NET 框架即可工作。 使用 wxWidgest 或 QT 可以使您的应用程序可跨多个平台移植。 .NET 保证您固定在 VisualStudio / Windows 上。如果您已经熟悉 .NET 框架,与使用全新框架相比,它可以减少工作量。另一方面,使用纯 C++ 库不会引入您必须掌握的附加层(参考类与本机类)。简而言之 - 这取决于您的知识和用例。 @In silico:不,不一定。如果您计划仅在 Windows 上进行部署,并且您总是想使用 Visual Studio,那么 .NET Framework 不是一个大问题。无论如何,它在大多数没有 QT/WX 的计算机上都可用。 @Tobias Langner:您不需要在客户端机器上安装 Qt 或 wxWidgets“运行时”来运行 Qt 或 wxWidgets 应用程序。 AFAIK 它们可以静态编译,这些框架仅依赖于操作系统原语。如果不是静态的,您只需要随应用程序一起提供一个 DLL。【参考方案2】:托管 C++ 是 Microsoft 现已弃用的一组与 C++ 的偏差,包括语法和句法扩展、关键字和属性,以将 C++ 语法和语言引入 .NET Framework。这些扩展允许 C++ 代码以托管代码的形式面向公共语言运行时 (CLR),并继续与本机代码进行互操作。托管 C++ 不是一种完全独立的或成熟的编程语言。
托管 C++
#using <mscorlib.dll>
using namespace System;
int main()
Console::WriteLine("Hello, world!");
return 0;
原版 C++
#include <iostream>
using namespace std;
int main()
cout << "Hello, world!";
return 0;
【讨论】:
完全没用的“信息”。问题显然是在询问未弃用的 C++/CLI。【参考方案3】:嗯... C++ .NET 有点用词不当。 您可以使用 Visual Studio .NET 在 C++ 中进行编程。好吧,这就是它在很久以前的称呼。现在,人们只是将其称为 Visual Studio,并带有 dot NET 的绰号。好吧,至少初始屏幕的徽标中不再有大的 .NET 了。
可以理解,使用 Visual Studio (VS),您可以使用托管和非托管语言进行编程(顺便说一句,那里有很多选择)。
如果您想使用 Visual Studio 在 C++ 中编程,您有两种选择:
非托管或本机 C/C++。这是旧的(或者我猜也是新的)C++ 您一直都知道,并且您使用非托管内存进行编程。
托管 C++。他们称之为 C++/CLI。那是通过 CLI 读取 C++,而不是 C++ 除以 CLI!这是具有额外关键字的 C++,还有一些 比原生 C++ 更多的语法元素。这使您可以 利用 .NET 基础类库并在 .NET 框架。这当然使用垃圾收集器 托管类型的内存。
就我个人而言,我最喜欢的语言是 C#,但如果您需要在 C++ 和 .NET 之间进行互操作,则绝对不要使用托管 C++。这很容易做到,而且我认为比其他 P/Invoke 的东西更容易。
如果您要去某个项目,我建议您使用 C# 来制作您的 UI,并充分利用它所提供的一切。然后让该引用包含您的 C++ 代码的混合模式托管库。我认为这对你来说会容易得多。
你最后一个问题的答案是肯定的,你绝对可以在你的应用中使用它。
以下是依赖项的工作方式:
[C# App/GUI] 依赖于[托管 C++ 程序集] 依赖于 [Native C++ Lib]
【讨论】:
只是一个附录 - 现在认为托管 C++ 已弃用,取而代之的是 C++/CLI(来源:***.com/tags/managed-c%2B%2B/info)。 让我们将两者结合起来。 C# UI 和 C++ 框架。【参考方案4】: 是的,C++ 是非托管代码,而 C++/CLI 是托管代码。 是的,您可以在 C++/CLI 项目中使用非托管 C++ DLL。但是你必须为此编写一个包装器。这意味着您必须在 C++/CLI 项目中定义要访问的非托管方法。例子:
using System.Runtime.InteropServices;
[DllImport("YourDLLName")]
public static extern void UnmanagedMethodName(string parameter1);
【讨论】:
这不是真的,您可以使用来自 C++/CLI 项目的非托管 C++ 代码而不会出现任何问题,也不需要额外的工作。 只需#include 头文件并链接到.lib?毕竟是 C++。 对。我一直在考虑 C#。我的错。 @Timbo 感谢您的澄清。但我有一个 dll 文件而不是 lib 文件。为了包含头文件,我是否必须构建本地 C++ 项目来生成 lib 文件而不是 dll 文件?或者也可以在 dll 文件中包含头文件?我不确定这一点。您知道如何将 lib 或 dll 文件添加到 Visual Studio 中的 C++ 托管项目的示例吗?提前致谢。 其实C++ .Net
是一个错误的术语,不应该使用......它是C++/CLI以上是关于C++ 与 C++.NET 之间的主要区别是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章