C#实现热更新服务器程序的具体过程

目录
  • 热更新有没有解决一些开发问题的痛点
  • 热更新实现原理
  • 具体的实现过程
  • 总结

热更新有没有解决一些开发问题的痛点

其实首先探讨的一个问题就是,热更服务器程序到底有没有必要出现,或者说有没有适用场景,我个人觉得吧还是有的。

如果真的可以在不重启应用的情况下实现逻辑的更新,这未尝对于一些紧急的情况不是一个好消息,尤其是一些小团队、小创业公司刚起步的时候,技术测试流程和人力不会像成规模的企业那样完善,那么带来的问题就是上线后的应用、游戏可能会存在一些Bug,如果不严重还好,可以留到下一个迭代更新统一修复,但是如果严重了,又考虑如果此刻关服修复会导致用户流失,那么这时候不停服热更新就有了应用场景,可以在用户无感知的情况下进行逻辑的修复工作。这也是热更功能主要的适用场景,至于增加新功能或者删除一些功能也可以通过不停服的方式来操作。

那么说完这个需求后,接下就是怎么才能实现这个功能。其实这个功能主要还是利用了C#自带的反射,在新的Dotnet框架中.net core3.0以后和.net5.0以后,微软对Assembly加载做了进一步整理,虽然以前也有类似功能,但是众所周知的原因,以前的.net版本混乱,现在微软既开源也统一化版本,可以说在未来时间里,.Net的潜力不可估量,那么我所讲的,也是基于较新的框架版本实现的。

热更新实现原理

AssemblyLoadContext 这个类就是今天的主角,它的主要功能就是隔离式的程序上下文,什么意思,就是它具备一定保护,可以使动态加载的程序集不和静态加载的程序集混合在一起,而是独立运行在类似沙盒的空间里,但是又具备相互访问的权限。这就很厉害了,这样一来,我们可以加载自己的程序集,然后供本来应用调用,在需要更新的时候,把新的程序集加载进来,并且替换旧的程序,释放旧的程序集,这样就可以无缝衔接的执行新的逻辑了。

下面我就借用我自己写的框架来实现这个热更的过程,如果对热更原理本身感兴趣的,也可以去看看我写的热更源码,我会在文章最下面贴上我的开源项目地址,源码里面基本上都是有注释的,所以看起来也不会很难。

具体的实现过程

首先我们创建一个.Net5.0或者.Netcore3.1的项目,取名Abc。​

创建成功,我们找到依懒项,右击管理Nuget程序包,选择浏览标签搜索:EasySharpFrame,然后选中后点击下载按钮进行安装。

安装完成后,框架就算成功安装好了,接下来,我们再从解决方案右击新建一个新的项目,这个项目就是用于热更逻辑实现的动态库,名字就叫Hotfix,创建之后,在解决方案资源管理器一栏中就会看到这个项目已经成功添加进去了,之后我们右击这个Hotfix项目的依赖项,找到添加项目引用,直接把 Abc 勾选确定,至此项目的添加创建步骤就完成了。​​​​

接下来就是开始写代码实际应用了,首先在Abc主项目中的Program.cs入口中,调用框架中热更管理单例。因为我们没有更改Hotfix项目的默认配置,所以生成出来的Dll文件名就是Hotfix,然后我们在Hotfix项目里添加一个Main.cs的入口文件,这里通过热更管理器就完成了初始化,后面每次重载也只需要重复这个步骤就可以了。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");

        // 确保进行不会自动结束
        while (true)
        {
            // 调用热更模块加载Hotfix
            HotfixMgr.Instance.Load("Hotfix", "Hotfix.Main");
            // 回车继续,否则阻塞
            Console.ReadLine();
        }
    }
}

接下来,我们在Hotfix项目里Main.cs中加点测试内容。

public class Main
{
    public void Hello()
    {
        Console.WriteLine("Hello World");
    }
}

并且在刚刚主工程代码里加点东西。

// 调用热更模块加载Hotfix
HotfixMgr.Instance.Load("Hotfix", "Hotfix.Main");
// 这里可以通过Agent调用测试入口的函数
HotfixMgr.Instance.Agent.Hello();
// 回车继续,否则阻塞
Console.ReadLine();

这样一个简单的热更事例就完成了,接下来生成解决方案。然后找到Hotfix项目生成路径,把关于Hotfix.dll和Hotfix.pdb两个文件复制粘贴到Abc的生成路径下。双击Abc.exe,启动事例查看结果。注:pdb是用于给运行时提供出错时准确提示错误的解释文件,实际运行只需要dll,如果不需要查看问题出处,可以只复制dll即可。​

此时不要关闭控制台,继续回到VS中,修改一下Main.cs的内容,并且这次只生成Hotfix项目,把生成好的dll和pdb复制到Abc中。

public class Main
{
    public void Hello()
    {
        // 修改前
        // Console.WriteLine("Hello World");
        // 修改后
        Console.WriteLine("Hello New World");
    }
}

替换完成后,在控制台回车一下,结果显示,新的逻辑已经更新至程序中。

以上就是一个简单的热更流程展示,框架提供的热更功能还有更多功能,这里只是简单介绍一下热更的原理与实现。如果对框架感兴趣的朋友可以到github上去了解。

项目地址:github.com/suxf/EasySh

总结

到此这篇关于C#实现热更新服务器程序的文章就介绍到这了,更多相关C#热更新服务器程序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#实现热更新服务器程序的具体过程

    目录 热更新有没有解决一些开发问题的痛点 热更新实现原理 具体的实现过程 总结 热更新有没有解决一些开发问题的痛点 其实首先探讨的一个问题就是,热更服务器程序到底有没有必要出现,或者说有没有适用场景,我个人觉得吧还是有的. 如果真的可以在不重启应用的情况下实现逻辑的更新,这未尝对于一些紧急的情况不是一个好消息,尤其是一些小团队.小创业公司刚起步的时候,技术测试流程和人力不会像成规模的企业那样完善,那么带来的问题就是上线后的应用.游戏可能会存在一些Bug,如果不严重还好,可以留到下一个迭代更新统一

  • React Native 实现热更新并自动签名打包功能

    项目背景:手动link的安卓App 1.下载 react-native-code-push npm install --save react-native-code-push 2.在android/settings.gradle文件下新增: include ':app', ':react-native-code-push' project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../no

  • IDEA SpringBoot项目配置热更新的步骤详解(无需每次手动重启服务器)

    IDEA SpringBoot项目配置热更新的步骤 1.在pom.xml中添加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> 2.在pom.xml中添加插件: <

  • Android微信Tinker热更新详细使用

    先看一下效果图 Tinker已知问题 由于原理与系统限制,Tinker有以下已知问题: Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件: 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码: 在Android N上,补丁对应用启动时间有轻微的影响: 不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed": 由于各个厂商的

  • Python在游戏中的热更新实现

    目录 介绍: 原理: 1.标准import 2.reload函数 实现: 总结: 介绍: 热更新,就是在服务器不重启的的情况下,对游戏增加新的功能或者修复出现bug 的代码.游戏更新迭代速度快,催生了热更技术的需求,在我经历过的游戏项目中,无论是服务端还是客户端,版本的更新都是围绕着热更新,特别是现在游戏动辄几个G,每次让玩家下载完整的包不现实,随意游戏必须要支持热更.下面来谈一下客户端Python热更新的处理. 原理: 1.标准import 都知道Python提供了import可以导入一个标准

  • 微信Android热更新Tinker使用详解(星空武哥)

    Tinker是什么 Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码.So库以及资源,让应用能够在不需要重新安装的情况下实现更新.当然,你也可以使用Tinker来更新你的插件. 它主要包括以下几个部分: gradle编译插件: tinker-patch-gradle-plugin 核心sdk库: tinker-android-lib 非gradle编译用户的命令行版本: tinker-patch-cli.jar 为什么使用Tinker 当前市面的热补丁方案有很多,其中比较

  • Node.js巧妙实现Web应用代码热更新

    背景 相信使用 Node.js 开发过 Web 应用的同学一定苦恼过新修改的代码必须要重启 Node.js 进程后才能更新的问题.习惯使用 PHP 开发的同学更会非常的不适用,大呼果然还是我大PHP才是世界上最好的编程语言.手动重启进程不仅仅是非常恼人的重复劳动,当应用规模稍大以后,启动时间也逐渐开始不容忽视. 当然作为程序猿,无论使用哪种语言,都不会让这样的事情折磨自己.解决这类问题最直接和普适的手段就是监听文件修改并重启进程.这个方法也已经有很多成熟的解决方案提供了,比如已经被弃坑的 nod

  • 解读golang plugin热更新尝试

    当我们在使用php开发的时候,基本不需要关心热更新这件事的,因为PHP本身已经帮我处理好了,只需要提交代码,PHP重新解释一遍即可.而go则是静态语言,编译后得到的是直接被机器执行的,所有代码已经翻译成相对应的机器指令并且在运行时已经加载到内存,不能动态更新.那么如果想热更新就成了件麻烦的事,但是作为后端开发人员,很渴望支持这种功能,毕竟在线上能新增功能.修复bug客户端完全无感知是多么完美的事. 本文暂不讨论http这种无状态服务更新,网上能搜索到很多文章关于如何利用fd继承实现优雅重启.这里

  • 详解Angular5/Angular6项目如何添加热更新(HMR)功能

    本文介绍了详解Angular5/Angular6项目如何添加热更新(HMR)功能,分享给大家,具体如下: A:什么是HMR? Q:HMR(热替换)用于在运行的应用程序中更新代码而不需要重建它.这将导致更快的更新和更少的全页重新加载. angular6-hmr 提供angular6以上HMR(热更新)功能 步骤 1.进入angular项目父级目录内 git clone https://github.com/staven630/angular6-hmr angular6-hmr目录与angular项

  • nodemon实现Typescript项目热更新的示例代码

    我们都知道nodemon可以直接用来在开发环境下运行js文件,可以在文件改变时自动刷新和重启服务器.但是最近刚好在学typescript,所以就想使用ts来写,也想达到同样的效果,总结一下方法,大概有如下几种: nodemon+tsc: 这个方法很简单,首先通过tsc将我们的ts文件编译到dist目录下,然后再通过nodemon直接运行dist目录下的文件即可.至于ts的输出目录相关配置可在tsconfig.js中设置. tsc && nodemon --watch dist/index.

随机推荐