.NET给我什么,Win32不是?

.NET的用法给我什么,我没有使用Win32 – 有时可能会search一些50-100行代码我可以重用?

我正在开发Win32,因为它存在(> 15年)。 它的直观性和非常强大,虽然有时需要更多的电话比你想象的,当然,你需要跟踪手柄等。但我们(250.000 LOC)的应用程序安装在less于1分钟,它是非常罕见的有任何兼容性问题。

我已经跟着关于.NET和Win32(即Win32和.Net )的几个讨论。 但他们不回答这个问题。

答案很简单:抽象层次更高,与幕后“真实”的事物脱钩。 这就是为什么.NET可以在其他操作系统上实现的原因。

事实上,没有.NET,这一切都是可能的,但这是不可行的。 简短示例:.NET中的WCF为您提供了大家可以使用的第一类IPC和SOA框架。 它是建立在功能。 在win32中,你可以得到与第三方库或其他类似的自编码。 用户群很小,你没有那么大的社区支持你的问题,而且很难实现。 .NET Framework为您提供了这些开箱即用的功能。

对于大量的应用程序来说,.NET将加快开发时间并使开发更便宜。

对于特殊类型的应用,情况正好相反。 EG几乎不可能使用.NET开发实时应用程序,因为2级GC会冻结所有线程。

补充:
.NET框架4.5包括一个增强的垃圾收集器。 它为服务器垃圾回收器启用多线程后台垃圾回收(使用app.config中的<gcserver>元素启用),该回收不会冻结应用程序线程。

不幸的是,单声道垃圾收集器几乎没有那么先进,所以Mono的基本声明仍然是正确的。

恕我直言,只有一个开发Win32超过15年的人可以称之为直接和强大的。 如果你愿意自己写整个25万行而不是使用组件,那么你的应用程序将很容易安装。 我不确定这种权衡是否值得。

.NET给你的是更快的开发,出于种种原因。 更高的抽象度,优秀的组件,没有指针问题,更少需要管理自己的内存或句柄。 如果你已经开发了15年的Win32,也许你不需要这些。 你有过聘请新的初级程序员吗? 我确定他们学习.NET比Win32更快。 在你甚至可以说“Hello world”之前,Win32中有很多东西要学。

使用方便。 并且与其他.NET框架(非Win32相关的部分)之间的互操作性也很容易。

.NET没有什么神奇的东西,它只是大量预定义的类,用于轻松完成常见的任务。 许多这些任务是像“创建一个窗口”或其他Win32功能的东西。

至于Win32是“直接和强大”,我不这么认为。

下面是一个很好的例子:程序员需要的最基本的功能之一:检索与刚发生的错误相关的错误信息:

http://msdn.microsoft.com/en-us/library/ms679351%28VS.85%29.aspx

  • 7个参数
  • 阅读两张表来理解参数
  • 安全意见要考虑到
  • 必须调用特殊的特定函数(LocalFree)来释放系统分配的缓冲区。

只是为了实现这个简单的功能? 这是“直截了当的”?

Win32 API是最糟糕的设计,最令人费解的和难以使用(正确的,至少)API的存在之一。 它唯一能做到的事情就是让简单直观的用法变得错误,并且需要大量的步骤来实现正确性。

但是,当然,任何花费十年时间在API上工作的人都已经遇到了这些问题,并习惯于这些问题。 对你来说可能没有问题。 甚至更好,因为你已经有了你的申请,你可以坚持下去。 没有理由把它扔出来,并在.NET中重新开始

但是, 如果你今天从头开始一个项目,那么

  • 学习曲线在.NET中会更友好(但是,如果你已经过了学习曲线,那么重要性就不那么重要了)
  • 在.NET中,错误的范围将会减少(以“错误”的方式调用函数会更困难,即使你这样做了,也会有更少的坏事发生)
  • 找到新的程序员加入你的团队会更容易
  • 大多数人用C#这样的语言比C或C ++更有效率。 .NET提供的主要功能之一是能够使用.NET语言。 与此相比,班级图书馆可以被看作是锦上添花。

在使用ASP.NET / ASP.NET MVC进行Web开发之前,我已经用C ++开发了大约8年的游戏。 从我的角度来看,这些是使用.NET代替原生C ++代码时最重要的优点:

  • 非常好的IDE工具。 Resharper可以比VisualAssist做得更多
  • 没有更多的无效/空指针错误或泄漏的内存问题
  • 比Win32更好的API
  • 许多优秀的开源.NET库,比我能找到的C ++(即使没有C#Boost)
  • 感谢Mono,把你的软件移植到另一个平台比使用C ++更容易

两个字总结:

垃圾收集

WinAPI用于与最低级别的Windows进行交互,并涵盖Windows操作系统提供给用户的所有功能。

.Net是一个框架,一个运行库和一个大集合的库,它们服务于不同的目的和抽象的Windows API。 它基本上提供了隐藏Windows API的OO抽象。

如果您使用.Net您仍然透明地使用WinAPI,并且可以直接使用它,如果您选择通过PInvoking到本地API。

是否在WinAPI上选择.Net取决于您要构建的应用程序的类型。 如果这是一个大量集成的应用程序,那么使用WinAPI,如果不是,但是您需要使用强大的XML,连接(WCF),图形(WPF)或数据访问(ADO.Net,Linq)库,并且需要提高生产力。提供和交易超过一定的灵活性(你需要确保.Net运行在目标计算机上,这已经不是什么大事了)不是问题,然后选择.Net。

.NET本身实际上是围绕着Win32 API的,所以原则上你可以使用.NET来处理Win32 API所无法做到的事情。 .NET的优点是易于开发 – 这也意味着更快的交付和更少的错误。 .NET中的调试功能也更好。

.NET的安装和运行速度并不是什么问题。 您可以用任何语言编写蹩脚的软件,就像您可以用任何语言编写好的软件一样。 在.NET中有不同的提示和技巧,而不是C ++(所以这里肯定是一个学习曲线),但最终都是同样好的。

我甚至听说过一个好的编程C#程序实际上可能比等效的C ++程序更快,因为JIT编译器可以优化特定CPU的程序集,而C ++优化器只能进行通用优化。 不过我不知道这是不是真的。

.NET软件的兼容性也类似于C ++。 一方面它需要安装.NET框架,但另一方面,由于名称和GAC很强,不再需要DLL地狱。 很多东西已经在默认安装中,你通常需要在C ++中使用第三方库(比如XML解析,数据库连接,SOAP网络服务,RPC等等)。我认为它是平衡的, .NET可执行文件绝对是一个奖金。

在不了解应用程序本质的情况下很难回答这个问题。 如果这是一个典型的内部业务应用程序,有很多的数据库访问和报告生成,我会说,.NET带来了很多表。 如果是游戏,图像处理,或者一般来说,你正在销售给广泛的客户,我会坚持到Win32。

.NET使您能够以真实的语言编写Sql server存储过程。 尝试在Win32 DLL中做到这一点。

一些优点:

  1. 多语言支持。 现在很容易编写应用程序在Delphi中使用这个应用程序的逻辑代码写在VB中。 没有更多的COM,没有更奇特的调用技术 – 只是“添加参考”,它只是工作。 大多数情况下,因为一如既往地出现了一些问题,但与COM相比,.NET问题几乎不存在。

  2. 易于使用。 在Win32 API中,每一个调用都应该有很多初始化代码。 初始化之后,您通常必须调用具有某些标志的API方法来知道该如何预期以及如何为此调用分配缓冲区,然后再次调用此API方法,并使用其他参数来实际执行该任务。 毕竟,有一些清理代码。 在.NET中,你通常只是调用一些方法,因为所有杂乱的东西已经隐藏在内部。

  3. .NET是WinAPI以上的方式。 那么,现在Framework是用WinAPI编写的,但是几年之后(比如说Windows 9?),它将成为.NET Framework的内核。 传统应用程序将使用一些传统的转换器 – 用.NET Framework编写的WinAPI。

当我开发MS-DOS应用程序时,我也想知道有关Windows开发的一些类似的东西。 Windows很有趣,但我觉得DOS更实用。 也就是说,直到我开始编写Windows应用程序,并注意到Windows API非常有用。 我用于Windows(Delphi)的RAD环境使我很容易为我的应用程序开发一个很好的GUI。 对于Borland Pascal来说,虽然Turbo Vision为DOS提供了一个非常有用的环境,但是这有点复杂。 当.NET推出时,大约8年前,我只是认为它是Windows应用程序的一个大运行时库,就像Windows本身是MS-DOS的一个很酷的图形库一样。 这不是一个银弹或黄金锤子解决你的问题。 这只是让开发更容易的事情。

不过,当我将Windows应用程序与MS-DOS进行比较时,我仍然认为DOS更加健壮。 但是Windows对于我来说可以做很多很多事情,很容易。 当您将.NET与WIN32进行比较时也是如此。 事情变得更容易发展。

除了你已经做的点

  • .NET不太依赖于平台(在单声道下,它可以在Windows,Linux,OS X,BSD等上运行)
  • 你可以用VB,C#,C ++等编写.NET代码,并且用不同的语言编写的模块一起工作愉快,没有太多的痛苦。

其实我想你会发现.NET包装了很多win32功能。

我发现Visual Studio Express 8中的表单编辑器在我使用.NET对C ++进行编码时,会一直崩溃整个IDE。 当我使用普通的Win32进行C ++时,这不会发生。 当我使用.NET和C#编写表单时,这种情况不会发生,所以我一直不得不再次使用.NET,除非使用C#。

像.NET这样的虚拟机用于跨平台编码是非常好的。 如果您不对.NET以外的函数进行任何非托管调用,那么它可以在任何支持.NET的地方运行。

像X-Box 360一样。或者Windows CE / Mobile /无论如何。

对于微软和Windows开发者来说,这将是一件好事,因为低功耗设备将会像ARM这样的CPU更高效。 一个ARM 不会运行你的IA32 Windows应用程序,但它会运行你的.NET应用程序后,MS通过建立.NET的WinCE的.NET。

当然,Java也是这样做的,如果这是你所要做的,那么它在跨平台支持方面会更好更成熟。