0

我最近开始接触 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++/CLI,我不确定区别)而不是 C# 的目的?

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

4

1 回答 1

4

你确实很迷茫,你实际上并没有编写 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 类,例如 File 和 Assembly。

然而,结果您从纯 C++ 编译器获得的结果不同。您将获得一个 .NET 程序集,与使用 C# 编写代码时获得的动物完全相同。它通过抖动在运行时即时编译,即使您的纯 C++ 代码也能得到这种处理。

如果你想创建一个真正的 C++ 程序,那么你必须开始使用另一个项目模板。避免使用 CLR 节点,而是选择 Win32 节点来选择您的项目模板。当心您将体验到的文化冲击,您在 .NET Framework 中学到的任何东西都不会在纯 C++ 项目中可用。没有等效的 File 类,您需要使用<iostream>. 当然没有 Assembly 类,在本机代码中也没有对应的类。LoadLibrary() + GetProcAddress() 可能是最接近的匹配项,很难使用。准备好处理所有关于你期望它如何工作的假设,并为自己找到一本很好的 C++ 书籍,其中包含一些生存练习。

如果您这样做是为了避免依赖关系,那么请注意,您最终可能会遇到完全相反的问题。使用 DLL 的重要 C++ 项目将使您最终依赖于 C 运行时 DLL。必须由您将其部署在用户的机器上,它们不会像 .NET 那样预装在 Windows 上。

于 2013-07-02T09:55:32.167 回答