可能重复:
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库?
答案 0 :(得分:34)
这是正确的C ++是非托管代码,C ++ .NET是托管代码。
没有" C ++。NET"。有C ++ / CLI,它基本上是带有Microsoft扩展的C ++,允许您编写面向.NET框架的代码。 C ++ / CLI代码编译为CLR字节码,并像C#一样在虚拟机上运行。我假设您实际上在谈论C ++ / CLI。
关于这一点,可以说标准C ++是非托管的,而C ++ / CLI是托管的,但这是微软的术语。你永远不会看到这个术语" unmanaged"在谈论标准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数据类型可能需要一些额外的工作,但你当然可以使它工作。
答案 1 :(得分:11)
托管C ++是一种现在已弃用 Microsoft与C ++的偏差,包括语法和语法扩展,关键字和属性,用于将C ++语法和语言引入.NET Framework。这些扩展允许C ++代码以托管代码的形式定位到公共语言运行时(CLR),并继续与本机代码进行互操作。托管C ++不是一个完整的独立或完整的编程语言。
托管C ++
#using <mscorlib.dll>
using namespace System;
int main() {
Console::WriteLine("Hello, world!");
return 0;
}
Vanilla C ++
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!";
return 0;
}
答案 2 :(得分:6)
嗯...... C ++ .NET有点用词不当。 您可以使用visual studio .NET在C ++中编程。那就是它之前被称为它的东西。现在有几天人们称它为Visual Studio,带有点NET名字。好吧,至少闪屏不再是徽标中的大型.NET了。
可以理解,使用Visual Studio(VS),您可以使用托管和非托管语言进行编程(btw有很多选择)。
如果您想使用Visual Studio在C ++中编程,您有两种选择:
非托管或本机C / C ++。这是旧的(或者我也是新的)C ++ 您一直都知道,并使用非托管内存进行编程。
托管C ++。他们称之为C ++ / CLI。这是通过CLI读取C ++,而不是 C ++除以CLI!这是C ++,它有额外的关键字,还有一些 额外的语法元素比本机C ++。这允许你 利用.NET基础类库并做其他有趣的事情 .NET框架。这当然使用垃圾收集器 托管类型的内存。
就我个人而言,我最喜欢的语言是C#,但如果你需要在C ++和.NET之间进行互操作而不是使用Managed C ++。这很容易做到,我认为比其他P / Invoke更容易。
如果您要参加某个项目,我建议您使用C#进行用户界面,并充分利用它提供的所有功能。然后让该引用包含包含C ++代码的混合模式托管库。我认为这对你来说会容易得多。
您上一个问题的答案是肯定的,您肯定可以在您的应用中使用它。
以下是依赖关系的工作方式:
[C#App / GUI]依赖于[托管C ++程序集]取决于[Native C ++ Lib]
答案 3 :(得分:3)
示例:
using System.Runtime.InteropServices;
[DllImport("YourDLLName")]
public static extern void UnmanagedMethodName(string parameter1);