17

有没有人写过比 .NET 包还大的应用程序?人们过去常常批评 VB6 的 2 MB 运行时,但它很少使它所附带的应用程序相形见绌。

今天,尽管我的机器上安装了 Vista,但我不得不下载 35 MB 的 3.5 框架并重新启动,然后尝试使用一半大小的应用程序。

当您考虑到源代码安全性降低时,我想知道为什么有人会在 .NET 中开发 Windows 应用程序,而不是使用允许构建本机可执行文件的语言。

在编写在 Windows 上运行的应用程序时,.NET 有什么优势可以克服这些缺点?

4

10 回答 10

42

人们:请注意,这是在2009 年 2 月写的,当时说的很合适——在 2012 年末(3 年多后)对我大喊大叫是没有意义的。:-)

Delphi 对于 Win32 有一些相当大的优势。并不是说 .NET 应用程序天生就不好,但请尝试:

  • 在不存在 .NET 的 Win95/ME 上运行 .NET 应用程序(任何版本)(AFAIK)
  • 分发任何小型(< 1.5 MB).NET 应用程序(是的,软盘驱动器仍然存在)
  • 在无法访问 Internet 的系统上提供任何 .NET 应用程序(是的,它们存在)
  • 在没有广泛高带宽的国家/地区分发您的 .NET 应用程序
  • 不花很多钱就让人们看不到你的源代码(反思,有人吗?)

.NET 中的垃圾收集可能非常好,但是任何了解编程的人也可以使用 Delphi 轻松处理手动分配/释放内存,并且 GC 可用于引用计数接口。让所有非程序员大量使用 VB 的伪 GC 的原因不就是其中之一吗?IMO,GC 是使 .NET 变得危险的原因之一,就像 VB 很危险一样——它使事情变得太容易了,并且允许那些真正不知道自己在做什么的人编写最终会弄得一团糟的软件。(而且,在我在这里被火烧死之前,这对那些知道自己在做什么的人来说也很棒,VB也是如此;我只是不太确定对技术人员的优势是否超过了对我们的危害来自不熟练的人。)

Delphi Prism(AKA Rem Objects Oxygene,以前的 Chrome)提供了 Delphi 的 GC 版本,需要它的人正在寻找它,以及 ASP.NET 和 WPF/Silverlight/CE,具有 Delphi 的可读性(并且缺少花括号) . 对于那些(像我一样)Unicode 支持不是主要因素的人来说,Delphi 2007 提供了 ASP.NET 和 VCL.NET,以及本机 Win32 支持。而且,在像我工作的地方,当工作站(至少)每三年升级一次,并且我们刚刚淘汰了最后一台 Win95 机器,因为它不是升级的优先事项,.NET 框架是一个问题。(特别是公司代理要求只允许少数人访问互联网,限制带宽和下载能力,以及不允许使用 USB 设备的适当非管理员帐户,

我使用 .NET 语言(C#、Delphi Prism)工作,但全职和兼职都是来自 Win32 和 Delphi。

于 2009-02-14T03:27:47.900 回答
23

好的,我怀疑这会说服您,因为您不想被说服,但这是我对 .NET 相对于旧技术的优势的看法。我不会声称所有优势都适用于您在问题中提到的每种语言,或者 .NET 是完美的,但是:

  • 托管环境更早地捕获常见错误并提供新机会:

    • 强类型避免将一种类型不正确地视为另一种类型
    • 垃圾收集在很大程度上消除了内存管理问题(不完全,我很乐意承认)
    • “分段错误”通常转换为“NullReferenceException” - 但以更容易调试的方式!
    • 没有缓冲区溢出的可能性(当然,除了潜在的 CLR 错误)——这立即消除了一个很大的安全问题
    • 声明式安全模型和精心设计的运行时允许代码在各种信任级别下运行
    • JITting 允许 CLR 在 64 位机器上运行而无需重新编译(除了某些互操作情况)
    • JITter 也可以针对未来的处理器开发,在开发人员无需任何工作的情况下进行改进(包括无需重建或分发多个版本)。
    • 反射允许在非托管环境中完成各种不可能或困难的事情
  • 一个现代的面向对象框架:

    • 具有执行时间知识的泛型(与 Java 中的类型擦除相反)
    • 合理的线程支持,在 .NET 4.0 中提供了一组新的原语(并行扩展)
    • 从一开始就支持国际化和 Unicode - 一方面,只需考虑一种字符串类型 :)
    • Windows Presentation Framework 提供现代 GUI 框架,允许声明式设计、良好的布局和动画支持等
    • 很好地支持与本机库的互操作(例如,P/Invoke 比 JNI 好得多
    • 异常比错误代码提供更多信息(并且更容易处理)
    • LINQ(在 .NET 3.5 中)提供了一种处理进程内数据的可爱方式,并提供了处理数据库、Web 服务、LDAP 等的各种选项。
    • 委托允许从 VB 和 C# 进行某种功能性的编码风格;由于 lambda 表达式,这在 C# 3.0 和 VB9 中更好。
    • LINQ to XML 是我用过的最好的 XML 库
    • 使用 Silverlight 作为 RIA 框架允许您在轻量级客户端和其他访问方法之间共享大量代码
    • 一个非常好的版本控制故事,包括绑定重定向、运行时偏好等
  • 多种语言针对的一个框架:

    • 共享组件比使用(比如说)COM 更简单
    • 语言选择可以由任务和团队经验驱动。从 .NET 4.0 开始,这一点尤其重要:在更适合函数式语言的地方,使用 F#;如果使用动态语言更合适,请使用 IronRuby 或 IronPython;在所有语言之间轻松互操作
    • 坦率地说,我只是认为 C# 是一种比 VB 或 C++ 更简洁的语言。(我不了解 Delphi,不过我听说过关于它的好消息 - 嘿,你现在可以使用 Delphi 来定位 .NET。)

大部分的结果——以及我猜的原声——是.NET 允许更快地开发更健壮的应用程序

要解决您在问题中提到的两个具体问题:

  • 如果您的客户正在运行 Vista,他们已经拥有 .NET 3.0。如果他们运行的是 XP SP2 或 SP3,他们可能至少有 .NET 2.0。是的,如果你想使用它,你必须下载更新版本的框架,但我认为这是一个很小的问题。我认为将应用程序的大小与框架的大小进行比较没有任何意义。您是否将应用程序的大小与操作系统的大小或 IDE 的大小进行比较?
  • 我不认为反编译几乎是大多数人的问题。你真的需要想想你害怕什么:
    • 如果您害怕人们复制您的实际代码,那么如果您了解基本设计,从头开始编写代码通常会容易得多。请记住,反编译器不会给出局部变量名称(假设您不分发 PDB)或注释。如果您的原始源代码仅与反编译版本一样易于理解,那么您的问题比盗版更大。
    • 如果您害怕人们绕过您的许可并盗版您的代码,那么您应该记住在阻止人们盗版本机应用程序方面付出了多少努力 - 以及它是多么无效。
    • .NET 的很多用途是在服务器上或用于内部应用程序——在这两种情况下,反编译都不是问题。
    • 我在这篇关于反编译和混淆的文章中写了更多关于这个主题的文章。
于 2009-02-14T16:56:49.423 回答
12

仅举几例:

  • 自动内存管理、垃圾回收
  • 类型安全
  • 边界检查
  • 访问您不必创建的数千个课程
于 2009-02-13T23:01:22.660 回答
12

好的,首先,没有一种语言/平台会普遍优越。

  • 专业化总是会在某些领域提供更好的用例,但通用语言将适用于更多领域。
  • 多范式语言将遭受范式之间复杂的边界情况,例如
    • 任何函数式语言的类型推断,当呈现子类时也允许 OOP
    • C++的语法异常复杂,这直接影响到其工具链的能力。
    • c# 中 co/contra 方差与泛型相结合的复杂性很难理解。

较旧的语言将拥有可以工作的现有代码库,这既是积极的(经验,经过良好测试,广泛的支持文献),也是消极的(由此产生的对变化的惯性,多种不同的做事方式导致新进入者的困惑)。

就像大多数事情一样,语言和平台的选择/使用是利弊的平衡。

在下面的列表中,Delphi 有一些相同的优点和缺点,但也有很多不同。

.Net 的潜在负面因素(如果它们对您来说不是问题,它们就不是负面因素)

  • 是的,您需要部署(和安装)运行时,而且它很大。
  • 如果您想要一种具有多重继承的语言,您将不会得到它
  • BCL 集合库有一些严重的缺陷
  • 在 MS 领域之外没有得到广泛支持(单声道很棒,但它明显落后于官方实施)
  • 潜在的专利/版权产权负担
  • Jitted(忽略 ngen)启动时间总是会变慢,并且需要更多内存。

还有更多,但这些是亮点。

潜在的积极因素(如果它们对你不重要)

  • 通用 GC,没有阻止某些数据结构可用的引用计数,我知道没有没有 GC 的广泛使用的函数式语言,我想不出至少没有可选 GC 的过去 10 年的重要语言。如果您认为这没什么大不了的,那么您似乎是少数。
  • 大型 BCL(有些部分不如其他部分好,但非常广泛)
  • 可以使用大量语言(以及数量惊人的范式)并相互交互(我在一个更广泛的应用程序中使用 c#、f#、C++/CLI,在最有意义但能够轻松使用其中之一的各个方面)其他)。
  • 功能齐全的内省与声明式编程支持相结合。以这种方式,各种各样的框架变得更加简单和易于使用。
  • Jitted - 底层 CPU 架构的更改可以在很大程度上是透明的,预编译语言不可用的复杂运行时优化是可能的(java 目前在这方面做得更好)
  • 内存访问安全
  • Fusion dll 加载和系统 dll 的 GAC

同样专门针对 c#

缺点:

  • 基于 C 基础的语法
  • (pre 4.0) 后期绑定仅通过继承
  • 比一些命令式语言更冗长
  • 对复杂嵌入文字(正则表达式/xml/多行字符串)的处理不佳
  • 闭包中的变量捕获可能会令人困惑
  • 嵌套生成器既笨重又表现糟糕

临:

  • 基于 C 基础的语法
  • 通过 lambdas 提供许多功能支持
  • 允许对非代码区域(例如 Linq to SQL)进行编译时验证的表达式
  • 强类型,但有一些类型推断,使这更容易
  • 如果你真的需要不安全,那么你就在那里
  • 通过 P/Invoke 与现有 C++ ABI 代码的交互既简单又清晰。
  • 内置多播事件模型。
  • 轻量级运行时代码生成

C 基础确实是一个优点和缺点。大量程序员都可以理解它(与基于 Pascal 的风格相比),但有一定的麻烦(switch 语句就是一个明显的例子)。

强/弱/静态/动态类型系统是一个两极分化的辩论,但肯定没有争议的是,在类型系统更受限制的情况下,它应该努力不要求过多的冗长,c# 在这方面肯定比许多更好看待。

对于许多内部业务线应用程序而言,大量 .Net 平台的缺点是绝对无关紧要的(受控部署是公司内常见且已得到很好解决的问题)。因此,使用 .Net(这在很大程度上意味着 c#,对不起 VB.Net 的家伙)是 Windows 架构中新开发的一个非常明显的选择。

于 2009-02-14T13:54:23.340 回答
10

使用它开发复杂(和简单)应用程序的“简单性”。框架中已经为您编写了许多基本内容,您可以直接使用它。今天下载 35mb 文件比 8-6 年前下载 2mb 文件要容易得多。

于 2009-02-13T22:58:43.993 回答
7

有很多原因。我对 RealBasic 了解不多,但就 Delphi 而言:

  • 比 .NET 更广泛,开发社区更小。网上的很多德尔福资源都是古老而过时的。

  • 在 Delphi 2009 之前,Delphi 没有完整的 unicode 支持。

  • 我不知道 Delphi 2009,但 2007 没有很好的垃圾收集。它有某种笨拙的引用计数,需要代表开发人员进行一些干预。.NET 有一个更高级的 GC,它几乎可以为您完成所有工作。

  • .NET 有一个更大的标准库和更多最新的 3rd 方库。

  • 像 C# 这样的 .NET 语言可以说更好,而且对于那些刚接触该语言的人来说当然更容易理解。

于 2009-02-13T23:24:01.420 回答
6

.NET 开发人员在这里引用了许多假定的优势,但这些优势不应该在这种比较中,因为 Delphi 也有它们:

  • 类型安全
  • 边界检查
  • 访问您不必创建的数千个类(组件)

然而,.NET 中有一些东西是 Delphi 没有开箱即用的,只有其中一些可以由库和自己的代码添加。仅举几例:

  • 支持在同一运行时上工作的多种语言 - 允许为问题选择匹配的语言(例如,使用 F# 的函数式编程)
  • 动态源代码生成和编译——这对 Delphi 程序员来说是如此陌生,以至于他们可能甚至不知道它有什么用 [1]
  • 多播事件
  • 更好的多线程支持(例如 BackgroundWorker 类、异步委托)
  • 无缝支持 32 位和 64 位进程
  • 弱引用

[1] 如果您不知道但有兴趣,请查看Marc Clifton 的主页,尤其是有关声明式编程的文章。

编辑:我想回应梅森惠勒的评论:

  1. 重新动态代码:我知道有一些解决方案可以在应用程序中嵌入 Pascal 脚本。然而,将内部对象层次结构的一部分提供给脚本引擎,与在运行时用于代码的相同编译器之间存在明显差异。Delphi 编译器和脚本引擎的编译器之间总是存在差异的。无论如何,您从 .NET 获得的东西远远超出了 Delphi 可用的任何东西。无论如何,是否能够为 Delphi 编写类似的基础架构并不是重点,重点是 .NET 已经为您准备好了,当您需要它时。

  2. 重新多播事件:确切地说,有编码的方法,但它不是 Delphi / VCL 开箱即用的一部分。这就是我上面说的。

  3. 关于弱引用:可悲的是,您错了。尝试以不平凡的方式使用接口,在此过程中创建循环引用。然后您必须开始使用类型转换并希望使用弱引用。

于 2009-02-14T09:44:13.923 回答
4

嗯,.NET Framework 是为所有 .NET 应用程序共享的,所以您的机器上只有一次,现在 35MB 不算什么(与您的 Vista 安装的大小相比)。对于您的第二个 .NET 应用程序,您不必再次下载它。

于 2009-02-13T23:03:33.670 回答
4

对于 Windows 应用程序,.NET(使用 C# 或其他)使您可以更直接地访问最新和最强大的 Windows 功能。它也得到了微软的大力支持,拥有庞大的社区和很多关于它的书籍。

REALbasic(现在的Xojo)适用于跨平台应用程序。仅在 Windows 上使用它有时会很有用,但这不是它的优势(因为它非常易于使用)。

我对德尔福了解不多。

于 2009-02-13T23:46:28.073 回答
0

据我所知,RealBASIC 在对象关系工具方面没有太多(如果有的话),并且对于 n 层、以数据库为中心的应用程序可能不是一个好的选择。

于 2009-10-15T10:41:38.280 回答