ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

NETCore程序集复用技术:类型转移(TypeForwarding)

2022-01-25 19:05:40  阅读:187  来源: 互联网

标签:SPI NETCore 程序 复用技术 System mscorlib TypeForwarding Tccc


背景介绍

在netcore迁移过程中,发现原有针对netframework平台编译的dll文件,可以直接在netcore的应用(netcoreapp.31)中加载并使用。对此感到比较好奇,本文就针对此知识点进行探究和梳理。

本次演示用到的几个项目说明:
  • Tccc.TypeForwarding.Net451.SPI:代表针对net451平台的类库项目;
  • Tccc.TypeForwarding.NetApp:代表针对net451的控制台应用项目;
  • Tccc.TypeForwarding.NetCoreApp:代表针对netcore3.1的控制台应用项目;

Tccc.TypeForwarding.Net451.SPI中定义的类型Person源码如下:

    public class Person
    {
        public string Name { get; set; }
        public string Age { get; set; }
        public void PrintInfo()
        {
            Console.WriteLine("Assembly FullName=" + typeof(string).Assembly.FullName);
            Console.WriteLine("Assembly Location=" + typeof(string).Assembly.Location);
        }
    }

两个控制台应用的Program源码相同,均如下:

    internal class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person() { Name = "张三" };
            p1.PrintInfo();
            Console.ReadLine();
        }
    }
上述源码的目的是对比应用程序在不同平台的运行时,最常用的类型System.String所在的程序集有什么区别,并以此为突破口来探究相关技术点。  

.NETFramewok平台的特征分析

现在启动Tccc.TypeForwarding.NetApp得到的结果如下: 上述结果不出意料,就是证明了System.String类型的确位于mscorlib.dll中,同时根据路径名称也可以看得出此程序集就是位于.NETFramework运行时中。   进一步的,针对Tccc.TypeForwarding.Net451.SPI反编译可以看到程序集metadata确实声明了对mscorlib的引用。

NETCore平台的特征分析

现在来运行Tccc.TypeForwarding.NetCoreApp程序,看看输出结果有什么变化。 单纯看控制台输出好像也没有啥奇怪的,就是程序集名称改为System.Private.CoreLib,同时路径变为了netcore3.1运行时的位置。上述结果也仅说明了,System.String类型在netcore3.1平台上的代码实现是在System.Private.CoreLib程序集而已。这个知识点对接触过netcore的同学应该都有所了解。


不过这里值得注意的时,此时Tccc.TypeForwarding.Net451.SPI的目标平台依然是net451,而且根据上面反编译我们明明看到Tccc.TypeForwarding.Net451.SPI是引用了NET Framework的著名程序集mscorlib呢?

这里我们再次反编译netcore3.1目录下的Tccc.TypeForwarding.Net451.SPI程序集,验证确实还存在mscorlib的引用;

既然确实依赖了mscorlib,那就看看程序内存中加载了哪里的mscorlib文件。
PS:由于演示程序直接在VS中可方便查看,如果读者是以现有程序分析验证则可通过windbg的SOS扩展命令dumpdomain查看分析。
显然,虽然加载的都是mscorlib.dll文件,但是位置不同了:C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.21\mscorlib.dll 既然位置不同,是否内部实现也不同了呢?反编译看看:   打开此程序集后,就没有找到预期的System.String类型,并且压根就不存在其它类型的定义实现。看来这个mscorlib是个空壳文件。 那么真正的类型源码在哪呢?这就需要对反编译工具微调,改为IL格式查看,如下图,我们再次看到了熟悉的System.Private.CoreLib。 原来如此,这是把对mscorlib的引用,重定向到了System.Private.CoreLib程序集中。 这种技术称为TypeForwarding(类型转移),而这个空壳的mscorlib称为垫片(shim)程序集。

总结

以上是以类型System.String为例进行分析探究的,其它常用的类型如Int32、Task等,大家可自行实践验证看看。 另外,由于是微软官方支持的程序集复用,因此在做netcore迁移时,只要没有使用NETFramework特有的类型,那么原程序集不需要重新编译就可以放心的部署倒NetCore应用中。这在多部门、多应用的迁移过程中,大大降低了各组间的相互依赖。   参考资料:.NET Core跨平台的奥秘[下篇]:全新的布局 - Artech - 博客园 (cnblogs.com)

标签:SPI,NETCore,程序,复用技术,System,mscorlib,TypeForwarding,Tccc
来源: https://www.cnblogs.com/chen943354/p/15844192.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有