C ++ / CLI .NET依赖项?

时间:2013-07-02 06:48:06

标签: .net dependencies c++-cli .net-assembly

我最近接受了VC ++。 在C#中,我有这样的一行:

byte[] rn = File.ReadAllBytes("...");
Assembly.Load(rn);

但我想用母语做同样的事情。我自然而然地选择了C ++。

现在,我注意到MSDN上我可以从System.Reflection命名空间调用Assembly.Load(byte []):http://msdn.microsoft.com/en-us/library/h538bck7.aspx

但这不会增加.NET依赖吗?因此,在C#中使用C ++(或C ++ / CLI,我不确定其中的区别)来挫败我的目的?

还是有更好的方法来完成我想要做的事情吗?

1 个答案:

答案 0 :(得分:3)

你确实很丢失,你实际上并没有编写C ++代码。只有在使用C ++ / CLI语言编写代码时,才能使用File :: ReadAllBytes()和Assembly :: Load()等方法。这是Visual Studio,C ++ / CLI,VB.NET和C#中支持的三种.NET语言之一。

C ++ / CLI非常特殊,因为编译器还支持编写本机C ++代码并将其与.NET代码自由混合。您可以使用标准C ++库,只要您的代码符合C ++ 03语言标准,编译器就会将您的代码转换为IL而无需投诉。此外,您还可以访问所有.NET Framework类,例如文件和程序集。

然而,结果 not 类似于您从纯C ++编译器获得的内容。你会得到一个.NET程序集,就像用C#编写代码时所获得的那种动物一样。它可以在运行时由抖动进行即时编译,即使你的纯C ++代码也能得到这种处理。

如果你想创建一个真正的C ++程序,那么你必须开始使用另一个项目模板。避免使用CLR节点,选择Win32节点来选择项目模板。要注意您将体验到的文化冲击,您在.NET Framework中学到的任何东西都将在纯C ++项目中提供。没有等效的File类,您需要使用<iostream>。当然没有汇编类,在本机代码中没有相同的东西。 LoadLibrary()+ GetProcAddress()可能是最接近的匹配,非常难以使用。准备好处理关于你如何期望它的工作的所有假设,并找到一本好的C ++书籍,以便生存。

如果你这样做是为了避免依赖,那么请注意,你最终不会遇到完全相反的问题。使用DLL的一个非平凡的C ++项目将使您最终依赖于C运行时DLL。哪个必须由您部署在用户的计算机上,它们不会预装在Windows上,如.NET。