2021我们相约一起用.NET改变Windows软件世界

171 阅读8分钟

目录

 成为C#版主

互联网启示录

改变.NET桌面应用,从替换Application.Run开始

现在,让我们开始吧!

令人惊讶的FirstApp.exe

新起点从第一个Web页面开始


成为 C# 版主

       不管最终是出于什么原因,我成为了C#论坛版主,内心里的纠结完全消失了。剩下的就是如何做好版主。自从C#面世的那一刻开始,差不多一直在关注C#,想起来有20多年了,20多年的时间,从编程语言的新宠到今天,我们看着C#一路变迁,看着她走向成熟,……。岁月催人老,有很多感慨,很多无奈……

       朋友们说选择做版主的关键是可以给社区带来什么,几周下来的考察,感觉上CSDN的这个板块似乎不是很活跃了,作为一个成熟的语言,还会有那么多的话题吸引人们的热情吗? 或许会是一个挑战,事在人为吧。

互联网启示录

       我们当然希望给程序员带来一个全新的气象,然而合适的切入点究竟在哪里,是一个微妙的话题。互联网时代,Web技术在很多方面都凸显出对桌面软件技术的优势,这一点看上去是不争的事实,而且这个趋势会愈演愈烈。面对互联网的发展,毋庸置疑,Web技术(与桌面软件相比)拥有更好的适应性。无论您的技术团队多么强大,您的软件系统交付之后,总会面对不断增长的用户需求,会经常面临需求变更、Bug、功能增加……,所有这些问题,在互联网大环境之下,是每一个开发团队必须客观面对的问题,面对我们提到的这些问题,桌面软件技术与Web技术相比,无疑显得“相形见绌”。

       有没有办法弥合Web 技术与桌面客户端技术之间的“ 鸿沟(gap )” ?如果我们找到这个途径,使得鸿沟得以弥合,那么桌面技术与Web技术二者之间“相得益彰”的彼此耦合,必然会成为互联网时代的一道靓丽景色……

       彻底弥合Web与Desktop软件之间的鸿沟,互联网浏览器是无法逾越的“门槛”。 也就是说,桌面软件必须面对互联网浏览器的存在,有人说,有了浏览器控件,或者WebView,是不是桌面软件在一定程度上弥补了互联网方面的先天不足?事实证明,WebView或者浏览器控件已经存在很久了,桌面软件与Web软件之间的差异从来就没有缩小过。将互联网浏览器看作一个公共基础起点,是一次全新的尝试,也就是说,Web Desktop 二者技术相得益彰的途径之一是:将浏览器看作通用基础设施以此为基点构造 Desktop 应用,应该是兼顾二者优点的一个具体的方案。

       为了兼顾已存在的技术资源,同时还需要适配今天的互联网技术,我们希望通过这个论坛,给出一个**明确的、开放的开源技术框架**,使得C#可以成为互联网桌面应用的生产力推动者。弥合Desktop与Web之间的鸿沟,需要一个简明的技术策略,希望广大开发者支持我们。

改变 .NET 桌面应用,从替换 Application.Run 开始

       为应用程序提供互联网基因,是我们的核心宗旨。不同于所有其他解决方案,我们从一个程序的入口开始,每一个C#应用,差不多都包含如下入口:(个别的架构例外)

namespace FirstApp
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Application对象是一个全局静态对象,Application对象的Run方法,其内部提供了整个应用的消息循环,确保了程序在生命周期之内正常运行。

       从代码的角度考虑,我们希望“一行代码解决最关键的问题,为此,我们提供了一个与Application对象地位平行的全局对象Cosmos,.NET桌面应用的消息循环被Cosmos对象接管了,这样新的系统里面的消息循环就会比Application对象控制的消息循环拥有更广泛的处理能力。我们的方案是:用“ Cosmos.Run() ”替换“ Application.Run(new Form1()) ”, 一次性“弥合Web 与Desktop 软件之间的鸿沟”,注意“Cosmos.Run() ”没有参数!

         一行 代码解决问题,事实上还是需要一些非代码方面的微调。以下几点开发者必须遵循:

  1. 修改 C# 工程的编译选项,我们只支持 64 位应用( Debug Release 64 位编译);
  2. 正确配置工程的 Manifest 文件;
  3. 下载 WebRuntime 运行时支撑包,类似于.NET Framework支撑环节,需要放在与exe文件相同文件夹之内;
  4. 正确引用 Cosmos.dll

我们提供一个 “一分钟视频教程” 系统介绍如上操作步骤。以上4个方面的调整,对程序员的代码几乎没有结构上的影响。

现在,让我们开始吧!

        从现在起,希望可以开启一个全新的、既熟悉又陌生的C#之旅。首先,您需要准备好一个C# WinForms工程(当然,您可以创建一个新工程)。参照我们的 “一分钟视频教程”,您可以很快完成我们需要的调整。做为示范,我们创建了一个最基本的C#工程FirstApp,只不过我们对Form1对象增加了一个label以及一个panel对象如图所示:

(注意我们设置了panel1对象的Anchor属性)

在完成了我们需要的调整之后,即可以编译了。

令人惊讶的 FirstApp.exe

         似乎我们几乎什么都没有写,代码环节仅仅是

            Universe.Cosmos.Run();

替换了

            Application.Run(new Form1());

这个替换,使得FirstApp看上去没有启动任何一个Form对象,事实上的确如此!接下来会怎样?(待续……)

****Cosmos是我们新引进的全局、静态.NET对象,与Application对象类似,在一定程度上看相当于一个新版本的Application对象。.NET桌面应用的消息循环被Cosmos对象接管了,这样新的系统里面的消息循环就会比Application对象控制的消息循环拥有更广泛的处理能力。一般情况下,Application的Run方法需要一个Form对象或者一个Context对象做为参数,如果Run的参数是Context对象,需要用户自己基于代码创建应用程序的主Form。现在,我们看到的是Cosmos的Run方法是无参数的,这一点非常值得注意

         为了新系统拥有更好的适配性,我们允许每一个C#应用在不同的场景之中,拥有完全不同的主窗口,为此,应用系统的启动方式需要非常大的改变,新的应用模式,依赖于一个初始化Web页面,如果应用系统的可执行文件是“exename.exe”,那么启动页面的名字被内置为“exename.index.html”, 基于这样的考虑,当将系统部署到不同的文件夹,那么每个文件夹之中,会包含一个可执行文件(可以通过修改名字,获得一个新的可执行文件),进而需要一个与之匹配的初始化Web页面。

         不同的目录部署拥有完全不同的初始化页面,那么我们怎样表达不同的主窗体?*这个是一个现实、尖锐的问题。 *是无论如何都无法规避的问题,也是Cosmos带来的重大改变之一。系统的说,以下几个关键问题是Cosmos要解决的:

  1. C#程序怎样处理互联网浏览器形成的优质技术资源,以及浏览器在新系统里面是什么角色;
  2. 我们怎样在新系统里面基于Web技术处理.NET GUI对象,包括Form、User Control、WPF以及UWP对象;
  3. Javascript是什么角色?
  4. Web DOM会怎样改变?

以上几个问题,是核心问题,应该是统一Web、Desktop编程模型的关键所在。

新起点从 第一个Web页面 开始

一旦完成了如上的基本步骤,事实上向新技术框架的迁移工作已经完成了!也就是说全新的架构在不影响已有工程基本结构的前提下,已经完成了“鸿沟”填平的工作。 在具体展开技术方案之前,我们先建立一些个性认识,这样会更好的理解新系统。(待续)