精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

AOT漫談:C# AOT 的泛型,序列化,反射問題

開發 前端
在 .NET AOT 編程中,難免會在 泛型,序列化,以及反射的問題上糾結和反復糾錯嘗試,這篇我們就來好好聊一聊相關的處理方案。

一、背景

講故事

在 .NET AOT 編程中,難免會在 泛型,序列化,以及反射的問題上糾結和反復糾錯嘗試,這篇我們就來好好聊一聊相關的處理方案。

二、常見問題解決

1. 泛型問題

研究過泛型的朋友應該都知道,從開放類型上產下來的封閉類型往往會有單獨的 MethodTable,并共用 EEClass,對于值類型的泛型相當于是不同的個體,如果在 AOT Compiler 的過程中沒有單獨產生這樣的個體信息,自然在運行時就會報錯,這么說可能有點懵,舉一個簡單的例子。

internal class Program
    {
        static void Main(string[] args)
        {
            var type = Type.GetType(Console.ReadLine());

            try
            {
                var mylist = typeof(List<>).MakeGenericType(type);

                var instance = Activator.CreateInstance(mylist);
                int count = (int)mylist.GetProperty("Count").GetValue(instance);
                Console.WriteLine(count);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }

    public class Location
    {
    }

圖片

從上圖看直接拋了一個異常,主要原因在于 Location 被踢出了依賴圖,那怎么辦呢?很顯然可以直接 new List<Location> 到依賴圖中,但在代碼中直接new是非常具有侵入性的操作,那如何讓侵入性更小呢?自然就是借助 AOT 獨有的 rd (Runtime Directives) 這種xml機制,具體可參見:https://github.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/docs/rd-xml-format.md

rd機制非常強大,大概如下:

1)可以指定程序集,類型,方法作為編譯圖的根節點使用,和 ILLink 有部分融合。2)可以手工的進行泛型初始化,也可以將泛型下的某方法作為根節點使用。3)為Marshal和Delegate提供Pinvoke支持。

在 ilc 源碼中是用 compilationRoots 來承載rd過去的根節點,可以一探究竟。

foreach (var rdXmlFilePath in Get(_command.RdXmlFilePaths))
{
    compilationRoots.Add(new RdXmlRootProvider(typeSystemContext, rdXmlFilePath));
}

有了這些知識就可以在 rd.xml 中實例化 List<Location> 了,參考如下:

<?xml versinotallow="1.0" encoding="utf-8" ?>
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
 <Application>
  <Assembly Name="Example_21_1">
   <Type Name="System.Collections.Generic.List`1[[Example_21_1.Location,Example_21_1]]" Dynamic="Required All" />
  </Assembly>
 </Application>
</Directives>

同時在 csproj 做一下引入即可。

<Project Sdk="Microsoft.NET.Sdk">
 <PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>net8.0</TargetFramework>
  <ImplicitUsings>enable</ImplicitUsings>
  <Nullable>enable</Nullable>
  <PublishAot>true</PublishAot>
  <InvariantGlobalization>true</InvariantGlobalization>
 </PropertyGroup>
 <ItemGroup>
  <RdXmlFile Include="rd.xml" />
 </ItemGroup>
</Project>

執行之后如下,要注意一點的是 Dynamic="Required All" 它可以把 List<Location> 下的所有方法和字段都注入到了依賴圖中,比如下圖中的 Count 屬性方法。

圖片圖片

2. 序列化問題

序列化會涉及到大量的反射,而反射又需要得到大量的元數據支持,所以很多第三方的Json序列化無法實現,不過官方提供的Json序列化借助于 SourceGenerator 將原來 dll 中的元數據遷移到了硬編碼中,從而變相的實現了AOT的Json序列化,參考代碼如下:

namespace Example_21_1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var person = new Person()
            {
                Name = "john",
                Age = 30,
                BirthDate = new DateTime(1993, 5, 15),
                Gender = "Mail"
            };

            var jsonString = JsonSerializer.Serialize(person,
                                            SourceGenerationContext.Default.Person);

            Console.WriteLine(jsonString);
            Console.ReadLine();
        }
    }
}

[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Person))]
internal partial class SourceGenerationContext : JsonSerializerContext { }

public class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
    public DateTime BirthDate { get; set; }
    public string Gender { get; set; }
}

當用 VS 調試的時候,你會發現多了一個 SourceGenerationContext.Person.g.cs 文件,并且用 properties 數組承載了 Person 的元數據,截圖如下:

圖片圖片

3. 反射問題

反射其實也是一個比較糾結的問題,簡單的反射AOT編譯器能夠輕松推測,但稍微需要上下文關聯的就搞不定了,畢竟涉及到上下文關聯需要大量的算力,而目前的AOT編譯本身就比較慢了,所以暫時沒有做支持,相信后續的版本會有所改進吧,接下來舉一個例子演示下。

internal class Program
    {
        static void Main(string[] args)
        {
            Invoke(typeof(Person));

            Console.ReadLine();
        }

        static void Invoke(Type type)
        {
            var props = type.GetProperties();

            foreach (var prop in props)
            {
                Console.WriteLine(prop);
            }
        }
    }

    public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public DateTime BirthDate { get; set; }
        public string Gender { get; set; }
    }

這段代碼在 AOT中是提取不出屬性的,因為 Invoke(typeof(Person)); 和 type.GetProperties 之間隔了一個 Type type 參數,雖然我們肉眼能知道這個代碼的意圖,但 ilc 的深度優先它不知道你需要 Person中的什么,所以它只保留了 Person 本身,如果你想直面觀測的話,可以這樣做:

  • 將 <PublishAot>true</PublishAot> 改成 <PublishTrimmed>true</PublishTrimmed>
  • 使用 dotnet publish 發布。
  • 使用ILSPY觀測。

截圖如下,可以看到 Person 空空如也。

圖片圖片

有了這個底子就比較簡單了,為了讓 Person 保留屬性,可以傻乎乎的用 DynamicallyAccessedMembers 來告訴AOT我到底想要什么,比如 PublicProperties 就是所有的屬性,當然也可以設置為 ALL。

static void Invoke([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] Type type)
        {
            var props = type.GetProperties();

            foreach (var prop in props)
            {
                Console.WriteLine(prop);
            }
        }

如果要想侵入性更小的話,可以使用 TrimmerRootDescriptor 這種外來的 xml 進行更高級別的定制,比如我不想要 Gender 字段 ,具體參考官方鏈接:https://github.com/dotnet/runtime/blob/main/docs/tools/illink/data-formats.md#xml-examples

<Project Sdk="Microsoft.NET.Sdk">
 <PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>net8.0</TargetFramework>
  <ImplicitUsings>enable</ImplicitUsings>
  <Nullable>enable</Nullable>
  <PublishAot>true</PublishAot>
  <InvariantGlobalization>true</InvariantGlobalization>
  <IlcGenerateMapFile>true</IlcGenerateMapFile>
 </PropertyGroup>
 <ItemGroup>
  <TrimmerRootDescriptor Include="link.xml" />
 </ItemGroup>
</Project>

然后就是 xml 配置。

<?xml versinotallow="1.0" encoding="utf-8" ?>
<linker>
 <assembly fullname="Example_21_1">
  <type fullname="Example_21_1.Person">
   <property signature="System.Int32 Age" />
   <property signature="System.String Name" />
   <property signature="System.DateTime BirthDate" />
  </type>
 </assembly>
</linker>

從下圖看,一切都是那么完美。

圖片圖片

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2024-10-11 14:42:59

2024-10-14 13:01:33

AOTcpu符號

2009-08-24 17:14:08

C#序列化

2021-01-20 08:24:38

序列化內存對象

2009-08-06 11:16:25

C#序列化和反序列化

2011-06-01 14:50:48

2009-08-25 14:24:36

C#序列化和反序列化

2024-05-06 00:00:00

C#序列化技術

2009-08-25 14:43:26

C#序列化和反序列化

2009-08-24 10:07:57

C#泛型處理

2009-08-24 16:19:42

C# 泛型方法

2009-08-26 18:02:05

C#泛型問題

2011-06-08 10:06:32

C#

2009-09-09 15:54:48

C# XML序列化

2009-08-25 14:59:39

C# XML序列化應用

2009-09-09 16:53:49

C# XmlSeria序列化

2009-09-09 16:30:59

C# BinaryFo

2009-08-25 15:15:08

C#對象序列化應用

2009-09-09 17:10:50

C# XML序列化

2009-08-24 14:43:35

C# 泛型
點贊
收藏

51CTO技術棧公眾號

99riav一区二区三区| 欧美日本精品| 色先锋aa成人| 日韩性感在线| 国产白浆在线观看| 亚洲一区二区| 亚洲美女精品久久| 中文字幕 91| 激情av在线播放| 久久综合久久综合久久| 成人精品一区二区三区| 久草中文在线视频| 国产一区二区三区日韩精品| 日韩一区二区三区在线视频| 男人日女人逼逼| 在线观看免费高清完整| 波多野结衣中文一区| 国产精品高清免费在线观看| 久久久国产精华液| 国产一区二区三区天码| 精品久久久久久久久久久久包黑料| 99精品视频在线看| 日本色护士高潮视频在线观看| 久久久国产午夜精品| 99re视频| www.亚洲激情| 一区二区三区精品视频在线观看| 中文字幕亚洲欧美日韩在线不卡 | 男人天堂资源网| 粉嫩一区二区三区四区公司1| 欧美色爱综合网| 亚洲色成人一区二区三区小说| 污的网站在线观看| 日韩一区在线播放| 精品视频一区二区三区四区| 999免费视频| 美女视频免费一区| 国产成人精品a视频一区www| 日韩女优在线观看| 欧美体内she精视频在线观看| 日韩在线播放av| 国产又黄又粗的视频| 网曝91综合精品门事件在线| 精品久久久久久亚洲综合网| 中文字幕亚洲影院| 日韩黄色在线| 欧美亚洲免费在线一区| 可以免费在线看黄的网站| 蜜桃视频在线观看播放| 香蕉av福利精品导航| 欧美性猛交内射兽交老熟妇| 毛片网站在线免费观看| 国产精品久久久久7777按摩| 婷婷五月色综合| porn亚洲| 国产精品每日更新在线播放网址| 欧美性天天影院| 男人av在线| 国产婷婷色一区二区三区四区| 欧美精品一区二区三区四区五区| 亚洲欧美综合一区二区| 91麻豆免费观看| 欧美日韩精品久久| 国产亚洲依依| 国产精品久久久久影视| 中文字幕欧美日韩一区二区三区 | 国产欧美1区2区3区| 欧洲精品亚洲精品| 高清av在线| 国产精品灌醉下药二区| 成年人三级视频| 国产美女福利在线观看| 五月开心婷婷久久| 精品视频一区二区在线| 91亚洲精品| 91精品国产一区二区三区| 国产成人av免费观看| 豆花视频一区二区| 亚洲视频日韩精品| 久久爱一区二区| 欧美午夜不卡影院在线观看完整版免费| 欧美成人在线免费视频| 香蕉视频一区二区| 日本特黄久久久高潮| 成人黄色在线播放| 少妇一级淫片免费看| 久久久久国产精品麻豆| 中文字幕一区二区三区最新| 黄色影院在线看| 日本乱码高清不卡字幕| 欧美特黄aaa| 福利片一区二区| 亚洲午夜久久久影院| 国产在线观看免费视频软件| 亚洲精品1234| 国产精品天天狠天天看| 欧美一区,二区| 国产精品另类一区| av女优在线播放| 亚洲四虎影院| 亚洲成人久久网| 四虎国产精品成人免费入口| 欧美成人一区二免费视频软件| 久久久久久久久电影| 日韩国产亚洲欧美| 成人免费视频视频| 伊人久久大香线蕉精品 | 日韩美女福利视频| jlzzjlzzjlzz亚洲人| 久久青草国产手机看片福利盒子 | 蜜臀av在线| 在线观看av一区二区| 国产黄色一区二区三区| 欧美手机视频| 96精品视频在线| av中文字幕第一页| 国产免费观看久久| 久久久一本二本三本| 成人自拍视频| 中文字幕日韩av| 日日摸天天添天天添破| 国产精品一二三四| 一本色道久久综合亚洲精品婷婷 | 午夜久久久影院| 亚洲综合123| 欧美色图激情小说| 日本成人免费在线| 欧美一级片免费| 亚洲自拍偷拍欧美| 日韩成人av免费| 精品国产91| 欧美孕妇性xx| 香蕉久久国产av一区二区| 一片黄亚洲嫩模| www.欧美激情.com| 99国产精品免费视频观看| 人体精品一二三区| 男操女在线观看| 黄色成人av在线| 看全色黄大色黄女片18| 欧美黄色一区二区| 91免费国产视频| 在线观看黄色av| 欧美日韩在线三级| 99自拍偷拍视频| 男人的天堂久久精品| 日韩精品另类天天更新| 亚洲伦乱视频| 亚洲天堂av高清| 高潮毛片又色又爽免费| 久久综合成人精品亚洲另类欧美| 国产免费黄视频| 西瓜成人精品人成网站| 国产91|九色| 青草久久伊人| 色婷婷久久久亚洲一区二区三区| 一级性生活大片| 日本伊人午夜精品| 亚洲资源在线网| 亚洲天堂网站| 久久国产精品99国产精| 亚洲精品成av人片天堂无码| 一区二区激情视频| 先锋资源av在线| 久久久久久穴| 亚洲精品国产精品国自产观看| 国产极品嫩模在线观看91精品| 中文字幕亚洲在线| 国产美女三级无套内谢| 亚洲一区二区在线观看视频 | 97超碰人人模人人人爽人人爱| 中文字幕中文在线不卡住| 污污视频在线免费| 亚洲高清成人| 欧美激情www| 色噜噜成人av在线| 欧美精品videossex性护士| 日韩性xxxx| 在线观看一区二区视频| 国产黄色小视频网站| 成人禁用看黄a在线| 精品人妻一区二区三区四区在线| 国产乱码精品一区二区亚洲| 国产精品自产拍高潮在线观看| а√中文在线8| 日韩av网站导航| 中文字字幕在线中文乱码| 亚洲免费看黄网站| 特级西西人体4444xxxx| 久久精品国产99久久6| 日本aa在线观看| 亚洲视频分类| 亚洲综合精品伊人久久| 欧美粗大gay| 精品少妇v888av| 免费一级毛片在线观看| 欧美一区日本一区韩国一区| 国产又爽又黄的视频| 国产精品国产三级国产三级人妇 | 5252色成人免费视频| 91.xxx.高清在线| 亚洲第一福利在线观看| 毛片在线免费播放| 亚洲v日本v欧美v久久精品| 日本爱爱爱视频| 成人午夜视频在线观看| 三上悠亚在线一区| 亚洲久久在线| 欧美aaa在线观看| 蜜桃精品噜噜噜成人av| 亚洲在线观看视频网站| 人人视频精品| 国内揄拍国内精品少妇国语| 伦xxxx在线| 亚洲区免费影片| 欧美综合视频在线| 制服丝袜在线91| 欧美日韩在线视频播放| 天天av天天翘天天综合网| 青青草偷拍视频| 国产精品国产三级国产aⅴ原创| av网页在线观看| 国产黑丝在线一区二区三区| 亚洲爆乳无码专区| av不卡免费看| 丁香色欲久久久久久综合网| 99久久精品网| 水蜜桃亚洲精品| 国产精品日韩精品中文字幕| 国产嫩草一区二区三区在线观看| 免费观看性欧美大片无片| 国产欧美日韩高清| 少妇精品视频一区二区免费看| 欧美在线一区二区视频| 18aaaa精品欧美大片h| 欧美精品在线极品| 成人日日夜夜| 久久香蕉国产线看观看av| 97人人在线| 揄拍成人国产精品视频| 每日更新在线观看av| 亚洲黄页网在线观看| 欧美熟女一区二区| 亚洲精品在线免费播放| 亚洲爱情岛论坛永久| 日韩一区二区三区免费看 | 亚洲天堂av在线免费观看| 深夜福利在线观看直播| 亚洲精品成人久久| 手机在线观看免费av| 亚洲国产精品人人爽夜夜爽| 天天操天天干天天插| 亚洲国产精品久久久久秋霞蜜臀| 韩国av免费在线观看| 精品国产乱码久久久久久图片| 亚洲国产精品国自产拍久久| 日韩精品一区二区三区在线播放 | 欧美一区二区三区久久久| 欧美视频中文字幕在线| 国产五月天婷婷| 婷婷成人综合网| 日日噜噜噜噜人人爽亚洲精品| 欧美性猛交xxxx乱大交3| 欧美brazzers| 精品视频资源站| 99精品免费观看| 精品卡一卡二卡三卡四在线| 日韩中文字幕免费在线观看| 日韩禁在线播放| www免费网站在线观看| 久久精品国产电影| 手机在线免费看av| 欧美在线视频网| 国产精品99| 欧美日韩国产综合视频在线观看中文| 欧美亚洲日本一区二区三区| 一本色道精品久久一区二区三区| jizzjizz国产精品喷水| 久久精品欧洲| 天堂av在线8| 大桥未久av一区二区三区中文| 亚洲国产综合视频| 国产精品国产自产拍高清av | 天天操天天色综合| 这里只有精品国产| 欧美一区二区黄| 同心难改在线观看| www.欧美三级电影.com| 黄页网站在线| 国产精品视频大全| xxxx日韩| 一本一本久久a久久精品综合妖精| 欧美国产精品| 成人性做爰aaa片免费看不忠| 黑人精品欧美一区二区蜜桃| 久久福利小视频| 中文av一区二区| 日韩av女优在线观看| 欧美综合欧美视频| 国产成人自拍一区| 在线日韩中文字幕| av影片在线| 国产欧美一区二区三区在线| 久久久久影视| 黄色影视在线观看| 天堂影院一区二区| 国产男女无遮挡猛进猛出| 2023国产精品自拍| 欧美成人一区二区三区高清| 91久久人澡人人添人人爽欧美| 精品黑人一区二区三区国语馆| 亚洲欧美一区二区三区在线| 在线中文字幕第一页| 国产精品欧美日韩| 女仆av观看一区| 国产美女作爱全过程免费视频| 日韩激情视频在线观看| 亚洲视频在线播放免费| 亚洲品质自拍视频| 日本一本在线观看| 亚洲精品国精品久久99热 | 国产精品aaa| 美女呻吟一区| 免费日韩在线观看| 久久成人免费网站| 色噜噜噜噜噜噜| 欧美性猛交xxxx乱大交蜜桃| 日本精品久久久久| 久久久久久久网站| 视频精品一区| 只有这里有精品| 久久99热这里只有精品| 亚洲第一视频区| 欧美性xxxx极品hd欧美风情| 色屁屁草草影院ccyycom| 欧美日韩成人在线观看| 999久久久国产999久久久| 亚洲一区二区三区精品在线观看 | 日韩免费黄色av| 色天天色综合| 日本不卡在线观看视频| 北条麻妃国产九九精品视频| 久久久久久免费观看| 日韩亚洲国产中文字幕欧美| 超鹏97在线| 91精品国产高清久久久久久91裸体 | 伊人222成人综合网| 91免费欧美精品| 亚洲欧美偷拍自拍| 日本少妇激三级做爰在线| 综合中文字幕亚洲| 国产精品无码在线播放| 久久精品99久久香蕉国产色戒| 亚洲欧洲日韩精品在线| 中文字幕欧美日韩一区二区三区| 久久er精品视频| 日韩在线中文字幕视频| 日韩写真欧美这视频| 2020av在线| 欧美精品免费观看二区| 青椒成人免费视频| chinese全程对白| 精品国内二区三区| 乱馆动漫1~6集在线观看| 欧美精品尤物在线| 免费成人性网站| 久久国产精品国语对白| 欧美草草影院在线视频| 国产高清中文字幕在线| 日本一区二区免费看| 寂寞少妇一区二区三区| 免费一级全黄少妇性色生活片| 亚洲国产成人av在线| 欧美大胆性生话| 大桥未久一区二区三区| a美女胸又www黄视频久久| 激情五月婷婷网| 色偷偷9999www| 999久久久久久久久6666| 熟女性饥渴一区二区三区| 中文字幕成人在线观看| www.五月天激情| 国产91精品久久久久久| 色婷婷亚洲mv天堂mv在影片| 91丝袜超薄交口足| 无码av中文一区二区三区桃花岛| 欧美777四色影视在线| 成人网在线免费看| 国产精品嫩草99av在线| 人妻互换一区二区激情偷拍| 日韩精品在线一区二区| 户外露出一区二区三区| 成人在线免费高清视频| 久久久国产精华| 亚洲国产欧美另类| 国产精品av在线播放| 欧美在线91| 国产91丝袜美女在线播放| 日韩精品一区二区在线| 日本欧美在线|