1分钟让您的.NET WinForm应用程序变成现代互联网浏览器

2023-11-16

目录

前言

一、WebRuntime是什么?

二、使用步骤

三、具体案例

总结


前言

让自己的应用拥有对接互联网的能力,应该是绝大多数开发者的愿望。这里给大家推荐一个开源项目:WebRuntime,通过这个项目,开发者可以在完全保留自己应用架构基础之上,通过一行代码的修改,即可使得自己的应用变成完整的互联网浏览器。与标准浏览器(Chrome、Edge)等的差异是应用程序的第一个窗口,这个窗口是开发者自己应用系统的主窗口,用户启动第二个程序实例或者基于自己的代码、超链接等,可以打开任意多个内置的浏览器窗口。应用系统的对象模型,直接成为Web DOM的一部分。给应用提供了极大的弹性。


一、WebRuntime是什么?

WebRuntime是一个开源项目。这个项目的核心目标是:让开发者将现代浏览器做为一个应用的起点,也就是说,在Chromium Project基础之上构建自己的应用系统。对.NET开发者而言,我们给出了最简单的方案:开发者只需下载本项目的二进制支持包,同时将“Application.Run“调用替换为“Cosmos.Run”。

二、使用步骤

本文只针对.NET开发者(当然WebRuntime也支持Win32),我们提供了 ”一分钟视频教程“。通过这个视频教程,开发者可以为自己的.NET工程提供内置的浏览器基因。

三、具体案例

我们在 二进制包(下载TheUniverse.zip) 之中,提供了最简单的示范应用FirstApp,exe,开发者可以在Git上下载FirstApp源代码,或者自己创建一个最简单的工程。

正确运行FirstApp.exe,我们现有一个初始化WebPage:”FirstApp.index.html“,页面的代码如下:

<!-- This is "index.html". Normally, it is named "ProjectName.index.html". This webpage is the real entry point of the HTML-driven App. -->
<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>欢迎您进入一个全新的.NET世界, 我是您的朋友WebRuntime</title>
    <link rel="icon" href="webpage/app.png" sizes="32x32">
    <script type="text/javascript">
        function OpenAppURL1() {
            cosmos.openUrl("host:webpage/WebApp1.html", 100);
        }
        function OpenAppURL2() {
            cosmos.openUrl("host:webpage/WebApp2.html", 100);
        }
        function OpenAppURL3() {
            cosmos.openUrl("host:webpage/WebApp3.html", 100);
        }
        function OpenAppURL4() {
            cosmos.openUrl("host:webpage/WebApp4.html", 100);
        }
        function OpenAppURL5() {
            cosmos.openUrl("host:webpage/WebApp5.html", 100);
        }
        function OpenAppURL6() {
            cosmos.openUrl("host:webpage/WebApp6.html", 100);
        }

        function OpenCWRURL() {
            cosmos.openUrl("host:webpage/CWR.html", 2);
        }

        function OpenCERURL() {
            cosmos.openUrl("host:webpage/CER.html", 2);
        }
        function OpenAppURLAsSubPage1() {
            cosmos.openUrl("host:webpage/SubWebApp1.html", 2);
        }
        function OpenAppURLAsSubPage2() {
            cosmos.openUrl("host:webpage/SubWebApp2.html", 2);
        }
        function OpenAppURLAsSubPage3() {
            cosmos.openUrl("host:webpage/WebApp3.html", 2);
        }

    </script>
</head>
<body>
    <cosmos>
        <!-- Define new DOM elements -->
        <define tagName="mainWindow"></define>
        <define tagName="application"></define>
        <define tagName="webViewport"></define>
        <!-- End Define new DOM elements -->
        <!-- The "application" element is required, it can provide application-level configuration. -->
        <application>
            <ntp>
                <winNucleus>
                    <xobj id='grid' rows='1' cols='2' width='350,350,' splitterwidth='6'>
                        <xobj objid="FirstApp.Form1,host"></xobj>
                        <xobj objid="nucleus"></xobj>
                    </xobj>
                </winNucleus>
            </ntp>
            <defaultworkbench>
                <winNucleus>
                    <xobj id='grid' rows='1' cols='2' width='350,350,' splitterwidth='6'>
                        <xobj objid="FirstApp.Form1,host"></xobj>
                        <xobj objid="nucleus"></xobj>
                    </xobj>
                </winNucleus>
            </defaultworkbench>
            <urls>
                <url url="host:WebPage/sunny.html"></url>
            </urls>
        </application>
        <mainWindow objid="FirstApp.Form1,host" caption="The Universe" width="2400" height="1600" id="mainForm">
            <panel1 id="mainworkclient">
                <default>
                    <winNucleus>
                        <xobj style="39" activepage="1">
                            <xobj caption="Cloudx Application" id='Splitter1' rows='1' cols='2' height='250,' width='350,350,' borderwidth='0' splitterwidth='6'>
                                <xobj objid="nucleus">
                                </xobj>
                                <xobj objid="" id="Sunny_ntpctrl">
                                </xobj>
                            </xobj>
                            <xobj caption="Common Web Runtime for Application" url="host"></xobj>
                        </xobj>
                    </winNucleus>
                </default>
            </panel1>
        </mainWindow>
        <webViewport>
            <winNucleus>
                <xobj rows="1" cols="2" width="750," id="xxx" caption="test caption">
                    <xobj objid="FirstApp.Form1,host" id="navCtrl">
                    </xobj>
                    <xobj objid="nucleus" id="mainClient">
                    </xobj>
                </xobj>
            </winNucleus>
        </webViewport>
    </cosmos>
    <strong style="font-size:32px; color:black">欢迎<i style="color:fuchsia">您来到</i><i style="color:blue">FirstApp的 </i><b style="color:coral">.NET桌面软件生态世界</b>!</strong>
    <h1 style="font-size: 16px; color:midnightblue"><i style="font-size:32px; color:blue">点击以下超链接</i> 体验全新的Web页面...</h1>
    <p>
        <a href="javascript:void(0);" onclick="OpenAppURL1();" style="font-size:16px;color:firebrick"><b>The First WebPage for Application</b></a>
        <hr />
        <a href="javascript:void(0);" onclick="OpenAppURL2();" style="font-size:16px;color:blueviolet"><b>让您的应用系统拥有互联网基因</b></a>
        <hr />
        <a href="javascript:void(0);" onclick="OpenAppURL3();" style="font-size:16px;color:forestgreen"><b>新的Web页面,新的表现力</b></a>
        <hr />
        <a href="javascript:void(0);" onclick="OpenAppURL4();" style="font-size:16px;color:brown"><b>让Web应用与桌面应用之间的鸿沟渐渐消失</b></a>
        <hr />
        <a href="javascript:void(0);" onclick="OpenAppURL5();" style="font-size:16px;color:cadetblue"><b>冲破约束,一片新天地呼之欲出</b></a>
        <hr />
        <a href="javascript:void(0);" onclick="OpenAppURL6();" style="font-size:16px;color:dodgerblue"><b>您可以做更多的事情,你的Web你做主</b></a>
        <hr />
        <a href="javascript:void(0);" onclick="OpenAppURLAsSubPage1();" style="font-size:16px;color:saddlebrown"><b>页面无处不在</b></a>
        <hr />
        <a href="javascript:void(0);" onclick="OpenAppURLAsSubPage2();" style="font-size:16px;color:springgreen"><b>您的创造力无限……</b></a>
        <hr />
    </p>
</body>
</html>

这里的规则是:每个”exeName.exe“需要一个初始化页面:”exeName.index.html“。

有了FirstApp.index.html,现在可以运行FirstApp.exe了。

启动FirstApp.exe,我们看到:

 对比一下Form1设计器界面:

我们发现,运行时窗体增加了很多元素,这一切都是如下Web页面元素:

        <mainWindow objid="FirstApp.Form1,host" caption="The Universe" width="2400" height="1600" id="mainForm">
            <panel1 id="mainworkclient">
                <default>
                    <winNucleus>
                        <xobj style="39" activepage="1">
                            <xobj caption="Cloudx Application" id='Splitter1' rows='1' cols='2' height='250,' width='350,350,' borderwidth='0' splitterwidth='6'>
                                <xobj objid="nucleus">
                                </xobj>
                                <xobj objid="" id="Sunny_ntpctrl">
                                </xobj>
                            </xobj>
                            <xobj caption="Common Web Runtime for Application" url="host"></xobj>
                        </xobj>
                    </winNucleus>
                </default>
            </panel1>
        </mainWindow>

 产生的效果,其中,panel1是Form1上的一个控件,这里给出的设计是,当Form窗体页面化的时候,其中心位置的控件,可以被Web页面进一步动态化。点击Form1窗体上给出的一组”超链接“,可以直接激活内置的浏览器:

 (应用页面,是由.NET控件与标准DOM元素合成的)

(调试界面) 

(新标签页 New TabPage) 

我们在FirstApp.index.html的如下部分确定每个新页面的基本样式:

        <application>
            <ntp>
                <winNucleus>
                    <xobj id='grid' rows='1' cols='2' width='350,350,' splitterwidth='6'>
                        <xobj objid="FirstApp.Form1,host"></xobj>
                        <xobj objid="nucleus"></xobj>
                    </xobj>
                </winNucleus>
            </ntp>
            <defaultworkbench>
                <winNucleus>
                    <xobj id='grid' rows='1' cols='2' width='350,350,' splitterwidth='6'>
                        <xobj objid="FirstApp.Form1,host"></xobj>
                        <xobj objid="nucleus"></xobj>
                    </xobj>
                </winNucleus>
            </defaultworkbench>
            <urls>
                <url url="host:WebPage/sunny.html"></url>
            </urls>
        </application>

(ntp 节点,ntp=”New TabPage“)

在下载的二进制包之中,提供了一个有一些复杂度的初始化页面”FirstApp1.index.html“,您可以将这个文件替换FirstApp.index.html(修改一下名字),看看更加综合的效果。


总结

我们希望:

  1. 每个.NET应用在完整保留原有结构的基础上,用最简明的途径给每个应用提供内置的全功能Chromium-Based互联网浏览器;
  2. 每个浏览器都可以将.NET GUI元素当作Web页面的DOM元素,Javascript可以响应这些GUI元素的事件;
  3. 提供基于目录的部署机制,使得没有文件夹之下,应用都有完全不同的Web配置、部署;
  4. 当用户工程之中,Application.Run被Cosmos.Run替换之后,用户的系统就完全实现基于Web技术的应用扩展机制,拥有自己的Web生态,每一个WinForm窗体都可以基于Web技术实现Web页面类似的动态表现力,在FirstApp.exe之中,我们看到了panel1表现出的动态性;
  5. 事实上,由FirstApp.exe,我们可以确信,每一款.NET桌面应用,都是一个Web内容引擎,如图标准浏览器一样。也就是说,WebRuntime揭示出桌面应用的双重性,其一是本地特性、其二是Web特性。
  6. 当WebRuntime被应用系统引用之后,扩展性就是一个普遍性问题,应用系统的原有模型被Web技术无限扩大了,这一点与原有系统形成本质的差异;
  7. FirstApp是一个极简的WinForm示范,事实上互联网时代,.NET桌面应用的潜力应该是“极为广阔“,如果浏览器是最小的应用,那么WebRuntime就会给开发者带来无限的创造力……
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1分钟让您的.NET WinForm应用程序变成现代互联网浏览器 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • Mintty(Cygwin)快速定位当前目录

    转发https blog csdn net x iya article details 78553308 方法一 新建批处理文件Cygwin bat E Cygwin bin mintty exe i Cygwin Terminal ico
  • 赛联区块链教育:对区块链技术做个普及

    区块链 比特币 加密货币在你的脑海中吗 您是否正在努力理解区块链的运作方式 您是否正在寻找该系统的学习信息以帮助您入行 下边的介绍帮你建立相关知识框架 区块链 十多年来 这个词出现在互联网 社交媒体 新闻上 并在全球范围内引起了广泛关注 1
  • Android 13 - Media框架(9)- NuPlayer::Decoder

    这一节我们将了解 NuPlayer Decoder 学习如何将 MediaCodec wrap 成一个强大的 Decoder 这一节会提前讲到 MediaCodec 相关的内容 如果看不大懂可以先跳过此篇 原先觉得 Decoder 部分简单
  • CNCF 官方大使张磊:什么是云原生?

    作者 张磊 阿里云容器平台高级技术专家 CNCF 官方大使 编者说 从 2015 年 Google 牵头成立 CNCF 以来 云原生技术开始进入公众的视线并取得快速的发展 到 2018 年包括 Google AWS Azure Alibab
  • 关于使用MSYS2安装mingw-win64下载两组包中出现ERROR导致升级全部失败的解决方案

    MSYS2网站操作 在最后一步阶段出现ERROR错误 导致升级全部失效 即使是多次重复尝试也不能解决 进行如下操作 pacman S mingw w64 x86 64 toolchain pacman S mingw w64 x86 64
  • jmeter实战案例

    一 前言 以前做了个抽奖活动的需求 需要做压测 只是简单帮助测试去做过压测 但没有自己从头到尾做过 最近再次碰到需要做压测 百度了一下使用教程 现在做个记录 以便以后做压测 直接借鉴教程 二 流程 1 启动jmeter 下载jmeter后
  • 阿里云云数据MongoDB版连接

    阿里云MongoDB连接 一 MongoDB Serverless版 1 登录进入阿里云控制台之后在搜索栏搜索mongodb进入MongoDB控制台 2 选择你所购买的资源区域 点击左侧server less实例列表找到自己的资源 如果是刚
  • 代码检查、走查与评审

    桌上检查 桌上检查是一种程序员检查自己的原程序的方法 桌上检查的目的是发现程序中的错误 桌上检查的检查项目主要有检查变量 标号的交叉引用表 检查子函数 宏 函数 等价性检查 常量检查 标准检查 风格检查 比较控制流 选择 激活路径 补充文档
  • 覆盖 Safari、Edge,主流浏览器几乎均已实现 WebGL 2.0 支持

    从 Firefox 到 Safari 所有的主流浏览器现已经全部支持 WebGL 2 0 近日 专注于制定开放标准的行业协会Khronos Group 重磅宣布当下所有主流浏览器均已实现了对WebGL 2 0的支持 简单来看 无需使用插件即
  • 照片的35x45,300dpi怎么弄

    做技术的难免会遇到一些杂活 一个35x45的照片 300dpi 要改为34x39 300dpi的图片 好像不太会 不过这样子弄 叫对方不要用微信发照片 微信强制会把照片改为96dpi 宽高都变了1个像素 因此照片压缩后再让其发过来 收到照片
  • LeetCode 108. 将有序数组转换为二叉搜索树Golang版

    LeetCode 108 将有序数组转换为二叉搜索树Golang版 1 问题描述 给你一个整数数组 nums 其中元素已经按 升序 排列 请你将其转换为一棵 高度平衡 二叉搜索树 高度平衡 二叉树是一棵满足 每个节点的左右两个子树的高度差的
  • 华为OD机试真题-积木最远距离【2023Q1】

    题目描述 小华和小薇一起通过玩积木游戏学习数学 他们有很多积木 每个积木块上都有一个数字 积木块上的数字可能相同 小华随机拿一些积木挨着排成一排 请小薇找到这排积木中数字相同且所处位置最远的2块积木块 计算他们的距离 小薇请你帮忙替她解决这
  • React & JSX 入门

    React JSX 入门 div div
  • 1600*D. Road Map(数学

    解析 记录每个点的父节点和子节点 从新的根节点开始遍历 遍历所有的非父结点即可 include
  • (一)大彩屏幕 进行串口通信

    一 简介 大彩屏幕通过串口收发信息 主要用来显示 装好软件 官网有或找技术人员要 VisualTFT 虚拟串口驱动 USB驱动 1 大彩屏幕来自大彩科技 使用该屏幕时 需要注意获取最新的软件版本 最新的Demo 这一点 你可以直接联系客服或
  • Vue刻度尺组件

    1 安装刻度尺组件 npm install cs ruler 2 在main js中全局引入组件 import CsRuler from cs ruler 刻度尺组件 Vue use CsRuler 3 组件使用
  • C#序列化和反序列化(json)

    一 什么是Json json是存储和交换文本信息的方法 类似xml 但是json比xml更小 更快 j更易于解析 并且json采用完全独立于语言的文本格式 即不依赖于各种编程语言 这些特性使json成为理想的数据交换语言 json使用Jav
  • UE4 命令工具打包

    用cmd进入UE4引擎的目录 Engine Build BatchFiles找到RunUAT bat cmd中输入以下命令 RunUAT BuildCookRun project F VidaUpdater VidaUpdater upro
  • QT 语言的学习 day10 数据库的学习 增删改 (QT 自带的数据库 QSqlDatabase数据库)

    1 基本知识的学习 Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作 这里我们所说的 平台独立 既包括操作系统平台 有包括各个数据库平台 另外 我们强调了 基于 SQL 因为 NoSQL 数据库至今没有一个通用查询方
  • 1分钟让您的.NET WinForm应用程序变成现代互联网浏览器

    目录 前言 一 WebRuntime是什么 二 使用步骤 三 具体案例 总结 前言 让自己的应用拥有对接互联网的能力 应该是绝大多数开发者的愿望 这里给大家推荐一个开源项目 WebRuntime 通过这个项目 开发者可以在完全保留自己应用架