当前位置: 首页 > wzjs >正文

服务好的做培训网站html学校网站模板

服务好的做培训网站,html学校网站模板,卓越高职院建设网站,做民宿需要和多家网站合作吗一:背景 1. 讲故事 开局一张表,故事全靠编,为了能够承上启下,先把参数列表放出来。 参数名说明__instance访问非静态方法的实例(类似 this)。__result获取/修改返回值,要想修改用 ref。__res…

一:背景

1. 讲故事

开局一张表,故事全靠编,为了能够承上启下,先把参数列表放出来。

参数名说明
__instance访问非静态方法的实例(类似 this)。
__result获取/修改返回值,要想修改用 ref
__resultRef修改返回引用(方法返回是 ref 返回 )。
__state在前缀和后缀间传递自定义数据 。
___fields读写私有字段(三下划线开头,修改需加 ref)。
__argsobject[] 形式访问所有参数(修改数组即修改参数)。
方法参数同名直接映射原参数。
__n__n 表示直接访问第 n 个参数,从 0 开始)。
__originalMethod获取原方法的 MethodBase
__runOriginal判断原方法是否被执行。

如果说上一篇聊到的参数是无害的,那这篇所聊到的参数就具有破坏性了,会让一些底层方法产生匪夷所思的输出结果。

二:补丁参数解读

1. __result

这个参数可以获取被注入方法的返回值,你可以对他进行查看和修改,为了让例子更有趣一点,我们对 DateTime.Now 进行注入,让它永远的丢失时分秒,是不是有点像黑客? 哈哈,参考代码如下:

internal class Program{static void Main(string[] args){var harmony = new Harmony("com.example.patch");harmony.PatchAll();var time = DateTime.Now;Console.WriteLine($"当前时间:{time}");Console.ReadLine();}}[HarmonyPatch(typeof(DateTime), "Now", MethodType.Getter)]public class DateTimeHook{public static void Postfix(ref DateTime __result){__result = __result.Date;}}

是不是让人很恼火,明明调的是 DateTime.Now ,怎么时分秒不见了。。。

2. __args

在 harmony 中有三种方式可以获取原方法的参数,分别为:

  • object[] __args 获取,支持读写。
  • __n 下标获取,支持读写。
  • parameter 同名法,默认只读,写的话要加 ref。

为了让例子更加有趣和黑客,我们对 HttpClient 的底层方法 SendAsync 进行拦截,然后纂改url,指向一个来历不明的网址,参考代码如下:

internal class Program{static async Task Main(string[] args){// 应用Harmony补丁var harmony = new Harmony("com.example.httpclient");harmony.PatchAll();var url = "https://www.cnblogs.com";var httpClient = new HttpClient();Console.WriteLine($"1.request:{url}");var response = await httpClient.GetAsync(url);var content = await response.Content.ReadAsStringAsync();Console.WriteLine($"2.response:\n{content.Substring(0, 500)}");Console.ReadKey();}}[HarmonyPatch(typeof(HttpClient), "SendAsync", new Type[] { typeof(HttpRequestMessage), typeof(HttpCompletionOption), typeof(CancellationToken) })]class HttpClientPatch{static void Prefix(object[] __args){HttpRequestMessage request = (HttpRequestMessage)__args[0];request.RequestUri = new Uri("http://www.baidu.com");}}

从卦中看,我明明请求的是 博客园,怎么给我返回 百度 的内容,是不是非常诡异。。。

可能有朋友看到了,这里有一个 (HttpRequestMessage)__args[0]; 强转的逻辑,能不能在 Prefix(object[] __args) 中直接接收 HttpRequestMessage 参数呢?可以的,这这就 harmony 的另外一种同名参数法,也就是参数名一定要和底层的 SendAsync 方法签名保持一致,截图如下:

修改后的代码如下,是不是非常的清爽。

[HarmonyPatch(typeof(HttpClient), "SendAsync", new Type[] { typeof(HttpRequestMessage), typeof(HttpCompletionOption), typeof(CancellationToken) })]class HttpClientPatch{static void Prefix(HttpRequestMessage request){request.RequestUri = new Uri("http://www.baidu.com");}}

可能有些人会遇到这样的情况,比如 SendAsync 方法的第一个参数是 internel 类型,由于是程序集可访问,所以你无法在另一个程序集的 Prefix 中声明此类型,这时候怎么办呢?可以借助 harmony 提供的 __n 索引法,下标是从0开始的。修改代码如下:

[HarmonyPatch(typeof(HttpClient), "SendAsync", new Type[] { typeof(HttpRequestMessage), typeof(HttpCompletionOption), typeof(CancellationToken) })]class HttpClientPatch{static void Prefix(object __0){Type requestType = __0.GetType();PropertyInfo requestUriProperty = requestType.GetProperty("RequestUri");Uri newUri = new Uri("http://www.baidu.com");requestUriProperty.SetValue(__0, newUri);}}

3. ___fields

这个参数也是一个非常简单粗暴的特性,它可以用三下划线___引出当前 this 实例上的私有字段,使用场景可以是这样的,我们知道 new Thread 默认是没有 ThreadName 的,这在高级调试中往往有所不便,所以可加这样的一段逻辑:一旦发现无名的 ThreadName 就给它赋一个默认的名字,参考代码如下:

internal class Program{static void Main(string[] args){var harmony = new Harmony("com.example.patch");harmony.PatchAll();var thread = new Thread(() => { });thread.Start();Console.WriteLine($"1.查看线程名:{thread.Name?.ToString()}");Console.ReadLine();}}[HarmonyPatch(typeof(Thread), "Name", MethodType.Getter)]public class ThreadStartHook{public static void Prefix(Thread __instance, ref string ____name){if (string.IsNullOrEmpty(____name)){____name = $"Default Threadid:{__instance.ManagedThreadId}";}}}

三:总结

这篇文章我们聊到的一些参数多多少少都带点黑客性质,建议大家不要乱用,这里声明一下,我所说的一切都是为.NET高级调试训练营服务的,也是给学员们提供的拓展资料。

http://www.dtcms.com/wzjs/833253.html

相关文章:

  • 南阳网站建设培训学校东莞网页开发
  • 做网站准备什么怎么做健康咨询网站
  • 网站建设类的计入什么科目建网站用什么软件最简单
  • 做网站怎么租用服务器吗自己买空间让网络公司做网站好吗
  • 关于学校网站建设经费的申请报告徐州市建设监理协会网站
  • 跨境电商网站排行榜通辽网站开发
  • 公司让做网站违法郑州网站建设丶汉狮网络
  • 专业的网站制作专业公司镇雄县城乡建设局网站
  • 合肥做双语外贸网站网站flash引导页
  • 深圳做网站建设的公司泉州网站建设方案服务
  • html网站地图如何建设企业微网站
  • 福州网站建设专业定制竞价排名广告
  • 深圳网站定制多少钱创鑫云网络
  • 建网站专业ui设计主要做什么工作
  • 企业营销网站的建设聊城网站建设的地方
  • 树莓派做网站服务器现在开网站做微商赚钱吗
  • 网站打不开别人能打开网站架构功能模块及描述
  • 怎么介绍自己做的电影网站特价锦州网站建设
  • 网站的建设服务器wordpress自定义首页
  • 网站关键词优化方案分为几个步骤备案个人可以做视频网站
  • 网站文章优化怎么做展览制作设计公司
  • 企业做企业网站的好处动态手机网站怎么做的
  • 网站建设策划稿wordpress评论后刷新
  • ps做电商网站流程图html怎么下载安装
  • wordpress 扒站设计网站要多久
  • 网络公司做的网站做百度推广去些网站加客户
  • 怎么制作网站小游戏马蹄室内设计网论坛
  • 做创意礼品的网站公司网站模板凡建站
  • 医药企业网站模板营销型网站的建设要求都有什么
  • 做网站项目的弊端郑州百度分公司