diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 887b129a..315bf86a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,7 +7,7 @@ version: 2 updates: - package-ecosystem: "nuget" - directory: "src/Natasha.CSharp/Core/Natasha.CSharp.Compiler" + directory: "src/Natasha.CSharp/Natasha.CSharp.Compiler" schedule: interval: "daily" commit-message: diff --git a/.github/project.yml b/.github/project.yml index cce8283e..2b2c83bb 100644 --- a/.github/project.yml +++ b/.github/project.yml @@ -87,10 +87,9 @@ samples: projects: [] src: folded_projects: - - src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/Natasha.CSharp.Extension.Ambiguity.csproj - - src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Natasha.CSharp.Codecov.csproj - - src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Natasha.CSharp.Compiler.Framework.csproj - src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Natasha.CSharp.Template.Framework.csproj + - src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Natasha.CSharp.Codecov.csproj + - src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/Natasha.CSharp.Extension.Ambiguity.csproj global_labels: - name: pr_src description: 此次提交包含 [源码工程] 相关的改动. @@ -102,25 +101,56 @@ src: - System - System.Runtime.CompilerServices - System.Reflection - id: 806EDCE9-74E4-41F3-9E97-74317EB209B3 + id: 6A64FCC4-0E19-4181-ABD8-D951DB6B75E9 is_ignored: false is_folded: false - relative_path: src/Natasha.CSharp/Core/Natasha.CSharp.Template/Natasha.CSharp.Template.csproj - project_name: Natasha.CSharp.Template - package_name: DotNetCore.Natasha.CSharp.Template - project_folder: src/Natasha.CSharp/Core/Natasha.CSharp.Template + relative_path: src/Natasha.CSharp/Natasha.CSharp.Compiler/Natasha.CSharp.Compiler.csproj + project_name: Natasha.CSharp.Compiler + package_name: DotNetCore.Natasha.CSharp.Compiler + project_folder: src/Natasha.CSharp/Natasha.CSharp.Compiler + labels: + dependency_config: + type: nuget + interval: daily + commit_prefix: '[DEPENDENCY SRC]' + special_time: + special_time_zone: + labels: + - name: dependencies + description: 有依赖需要升级 + color: 4E04B0 + ignore: + - name: Microsoft.Extensions.DependencyModel + versions: + versions_type: + - using_output: + enable: true + ignores: + - System + - System.Runtime.CompilerServices + - System.Reflection + id: A6A252E0-BC83-43D1-A118-371721F1A5D4 + is_ignored: false + is_folded: false + relative_path: src/Natasha.CSharp/Natasha.DynamicLoad.Base/Natasha.DynamicLoad.Base.csproj + project_name: Natasha.DynamicLoad.Base + package_name: + project_folder: src/Natasha.CSharp/Natasha.DynamicLoad.Base labels: dependency_config: - using_output: enable: true - ignores: - id: B810A41B-66BC-4FD4-B78E-CBFA0CF96A33 + ignores: + - System + - System.Runtime.CompilerServices + - System.Reflection + id: 02D796A3-A9FB-4E9C-972C-50B173DE213C is_ignored: false is_folded: false - relative_path: src/Natasha.CSharp/Core/Natasha.Domain/Natasha.Domain.csproj + relative_path: src/Natasha.CSharp/Component/Core/Natasha.Domain/Natasha.Domain.csproj project_name: Natasha.Domain package_name: DotNetCore.Natasha.Domain - project_folder: src/Natasha.CSharp/Core/Natasha.Domain + project_folder: src/Natasha.CSharp/Component/Core/Natasha.Domain labels: dependency_config: - using_output: @@ -129,28 +159,30 @@ src: - System - System.Runtime.CompilerServices - System.Reflection - id: 4DFD079F-2353-48A1-BDC7-1711491CB82C + id: CE5B5331-3F4F-412F-8169-8DA1D37170C6 is_ignored: false is_folded: false - relative_path: src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Natasha.CSharp.Compiler.csproj - project_name: Natasha.CSharp.Compiler - package_name: DotNetCore.Natasha.CSharp.Compiler - project_folder: src/Natasha.CSharp/Core/Natasha.CSharp.Compiler + relative_path: src/Natasha.CSharp/Component/Core/Natasha.CSharp.Compiler.Domain/Natasha.CSharp.Compiler.Domain.csproj + project_name: Natasha.CSharp.Compiler.Domain + package_name: + project_folder: src/Natasha.CSharp/Component/Core/Natasha.CSharp.Compiler.Domain labels: - dependency_config: - type: nuget - interval: daily - commit_prefix: '[DEPENDENCY SRC]' - special_time: - special_time_zone: - labels: - - name: dependencies - description: 有依赖需要升级 - color: 4E04B0 - ignore: - - name: Microsoft.Extensions.DependencyModel - versions: - versions_type: + dependency_config: + - using_output: + enable: true + ignores: + - System + - System.Runtime.CompilerServices + - System.Reflection + id: 1A79A124-5C6D-456E-8402-33A1FA68C566 + is_ignored: false + is_folded: false + relative_path: src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Natasha.CSharp.Template.Core.csproj + project_name: Natasha.CSharp.Template.Core + package_name: DotNetCore.Natasha.CSharp.Template + project_folder: src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core + labels: + dependency_config: test: folded_projects: [] global_labels: diff --git a/Natasha.sln b/Natasha.sln index b834f0ed..148d5982 100644 --- a/Natasha.sln +++ b/Natasha.sln @@ -197,19 +197,21 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Framework", "Framework", "{ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{57D0570C-7B6A-4795-960E-D37E9FFDA066}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.CSharp.Extension.Ambiguity", "src\Natasha.CSharp\Core\Extension\Natasha.CSharp.Extension.Ambiguity\Natasha.CSharp.Extension.Ambiguity.csproj", "{05F54420-1410-4240-9287-F410A24130E1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Component", "Component", "{B0EBDE47-FE8A-4BC6-A4EE-767CD405BB06}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.CSharp.Codecov", "src\Natasha.CSharp\Core\Extension\Natasha.CSharp.Codecov\Natasha.CSharp.Codecov.csproj", "{5FAA826B-DD53-488D-A9C4-1950B1D4DF2E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.CSharp.Compiler", "src\Natasha.CSharp\Natasha.CSharp.Compiler\Natasha.CSharp.Compiler.csproj", "{6A64FCC4-0E19-4181-ABD8-D951DB6B75E9}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.CSharp.Compiler.Framework", "src\Natasha.CSharp\Framework\Natasha.CSharp.Compiler.Framework\Natasha.CSharp.Compiler.Framework.csproj", "{3590A83D-8992-4A96-AC42-9704098C46ED}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Natasha.DynamicLoad.Base", "src\Natasha.CSharp\Natasha.DynamicLoad.Base\Natasha.DynamicLoad.Base.csproj", "{A6A252E0-BC83-43D1-A118-371721F1A5D4}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.CSharp.Template.Framework", "src\Natasha.CSharp\Framework\Natasha.CSharp.Template.Framework\Natasha.CSharp.Template.Framework.csproj", "{2FFCB9ED-F02E-4C26-9551-74EDE27E3DD4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.Domain", "src\Natasha.CSharp\Component\Core\Natasha.Domain\Natasha.Domain.csproj", "{02D796A3-A9FB-4E9C-972C-50B173DE213C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.CSharp.Template", "src\Natasha.CSharp\Core\Natasha.CSharp.Template\Natasha.CSharp.Template.csproj", "{806EDCE9-74E4-41F3-9E97-74317EB209B3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.CSharp.Compiler.Domain", "src\Natasha.CSharp\Component\Core\Natasha.CSharp.Compiler.Domain\Natasha.CSharp.Compiler.Domain.csproj", "{CE5B5331-3F4F-412F-8169-8DA1D37170C6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.Domain", "src\Natasha.CSharp\Core\Natasha.Domain\Natasha.Domain.csproj", "{B810A41B-66BC-4FD4-B78E-CBFA0CF96A33}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.CSharp.Template.Core", "src\Natasha.CSharp\Component\Core\Natasha.CSharp.Template.Core\Natasha.CSharp.Template.Core.csproj", "{1A79A124-5C6D-456E-8402-33A1FA68C566}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.CSharp.Compiler", "src\Natasha.CSharp\Core\Natasha.CSharp.Compiler\Natasha.CSharp.Compiler.csproj", "{4DFD079F-2353-48A1-BDC7-1711491CB82C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.CSharp.Codecov", "src\Natasha.CSharp\Extension\Natasha.CSharp.Codecov\Natasha.CSharp.Codecov.csproj", "{5A914466-79DF-4F6E-8A8F-829CBDCDFFDE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Natasha.CSharp.Extension.Ambiguity", "src\Natasha.CSharp\Extension\Natasha.CSharp.Extension.Ambiguity\Natasha.CSharp.Extension.Ambiguity.csproj", "{0A6025A4-97ED-4F67-9B49-82B417BCB81F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -361,34 +363,34 @@ Global {89A2EC20-B432-4C6A-B740-78BBD1BF80EC}.Debug|Any CPU.Build.0 = Debug|Any CPU {89A2EC20-B432-4C6A-B740-78BBD1BF80EC}.Release|Any CPU.ActiveCfg = Release|Any CPU {89A2EC20-B432-4C6A-B740-78BBD1BF80EC}.Release|Any CPU.Build.0 = Release|Any CPU - {05F54420-1410-4240-9287-F410A24130E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {05F54420-1410-4240-9287-F410A24130E1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {05F54420-1410-4240-9287-F410A24130E1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {05F54420-1410-4240-9287-F410A24130E1}.Release|Any CPU.Build.0 = Release|Any CPU - {5FAA826B-DD53-488D-A9C4-1950B1D4DF2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5FAA826B-DD53-488D-A9C4-1950B1D4DF2E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5FAA826B-DD53-488D-A9C4-1950B1D4DF2E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5FAA826B-DD53-488D-A9C4-1950B1D4DF2E}.Release|Any CPU.Build.0 = Release|Any CPU - {3590A83D-8992-4A96-AC42-9704098C46ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3590A83D-8992-4A96-AC42-9704098C46ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3590A83D-8992-4A96-AC42-9704098C46ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3590A83D-8992-4A96-AC42-9704098C46ED}.Release|Any CPU.Build.0 = Release|Any CPU - {2FFCB9ED-F02E-4C26-9551-74EDE27E3DD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2FFCB9ED-F02E-4C26-9551-74EDE27E3DD4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2FFCB9ED-F02E-4C26-9551-74EDE27E3DD4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2FFCB9ED-F02E-4C26-9551-74EDE27E3DD4}.Release|Any CPU.Build.0 = Release|Any CPU - {806EDCE9-74E4-41F3-9E97-74317EB209B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {806EDCE9-74E4-41F3-9E97-74317EB209B3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {806EDCE9-74E4-41F3-9E97-74317EB209B3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {806EDCE9-74E4-41F3-9E97-74317EB209B3}.Release|Any CPU.Build.0 = Release|Any CPU - {B810A41B-66BC-4FD4-B78E-CBFA0CF96A33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B810A41B-66BC-4FD4-B78E-CBFA0CF96A33}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B810A41B-66BC-4FD4-B78E-CBFA0CF96A33}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B810A41B-66BC-4FD4-B78E-CBFA0CF96A33}.Release|Any CPU.Build.0 = Release|Any CPU - {4DFD079F-2353-48A1-BDC7-1711491CB82C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4DFD079F-2353-48A1-BDC7-1711491CB82C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4DFD079F-2353-48A1-BDC7-1711491CB82C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4DFD079F-2353-48A1-BDC7-1711491CB82C}.Release|Any CPU.Build.0 = Release|Any CPU + {6A64FCC4-0E19-4181-ABD8-D951DB6B75E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A64FCC4-0E19-4181-ABD8-D951DB6B75E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A64FCC4-0E19-4181-ABD8-D951DB6B75E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A64FCC4-0E19-4181-ABD8-D951DB6B75E9}.Release|Any CPU.Build.0 = Release|Any CPU + {A6A252E0-BC83-43D1-A118-371721F1A5D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A6A252E0-BC83-43D1-A118-371721F1A5D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A6A252E0-BC83-43D1-A118-371721F1A5D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A6A252E0-BC83-43D1-A118-371721F1A5D4}.Release|Any CPU.Build.0 = Release|Any CPU + {02D796A3-A9FB-4E9C-972C-50B173DE213C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {02D796A3-A9FB-4E9C-972C-50B173DE213C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02D796A3-A9FB-4E9C-972C-50B173DE213C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {02D796A3-A9FB-4E9C-972C-50B173DE213C}.Release|Any CPU.Build.0 = Release|Any CPU + {CE5B5331-3F4F-412F-8169-8DA1D37170C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE5B5331-3F4F-412F-8169-8DA1D37170C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE5B5331-3F4F-412F-8169-8DA1D37170C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE5B5331-3F4F-412F-8169-8DA1D37170C6}.Release|Any CPU.Build.0 = Release|Any CPU + {1A79A124-5C6D-456E-8402-33A1FA68C566}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A79A124-5C6D-456E-8402-33A1FA68C566}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A79A124-5C6D-456E-8402-33A1FA68C566}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A79A124-5C6D-456E-8402-33A1FA68C566}.Release|Any CPU.Build.0 = Release|Any CPU + {5A914466-79DF-4F6E-8A8F-829CBDCDFFDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A914466-79DF-4F6E-8A8F-829CBDCDFFDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A914466-79DF-4F6E-8A8F-829CBDCDFFDE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A914466-79DF-4F6E-8A8F-829CBDCDFFDE}.Release|Any CPU.Build.0 = Release|Any CPU + {0A6025A4-97ED-4F67-9B49-82B417BCB81F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0A6025A4-97ED-4F67-9B49-82B417BCB81F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A6025A4-97ED-4F67-9B49-82B417BCB81F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0A6025A4-97ED-4F67-9B49-82B417BCB81F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -401,7 +403,7 @@ Global {BE249E27-1BFF-4DB5-9B05-478E80C5E7B1} = {082FE559-7B32-4D83-B01B-0D4934396891} {EB036B9F-DD9D-42BD-A132-32A71F77D27C} = {082FE559-7B32-4D83-B01B-0D4934396891} {8C9B862A-B569-460C-8B74-E74C6DF0CAB3} = {508A2E20-BB12-4610-8CB2-0B07B233DE68} - {0CB3AF52-50F3-4728-BAC6-389F2E995111} = {57D0570C-7B6A-4795-960E-D37E9FFDA066} + {0CB3AF52-50F3-4728-BAC6-389F2E995111} = {8C9B862A-B569-460C-8B74-E74C6DF0CAB3} {B9B66D92-BDFB-4D06-9C63-227176CD157C} = {5A4C28F6-36C5-4735-A1E0-E4BC5DD7F5F8} {5A4C28F6-36C5-4735-A1E0-E4BC5DD7F5F8} = {B4487ABB-27A2-4353-AB16-1A94B31E0210} {C11CDBDF-E204-412F-A1AF-C2AD83383599} = {5A4C28F6-36C5-4735-A1E0-E4BC5DD7F5F8} @@ -454,15 +456,16 @@ Global {716B9CEC-8CA2-433F-9E9A-974E536C4099} = {F4622BCB-C287-4AFE-916B-8C138BD15A3D} {7CD6F3A9-85F0-4F01-8B68-7FCC527768E6} = {B4487ABB-27A2-4353-AB16-1A94B31E0210} {89A2EC20-B432-4C6A-B740-78BBD1BF80EC} = {B4487ABB-27A2-4353-AB16-1A94B31E0210} - {64F66ABD-6398-417B-95D7-A8B51077FB3C} = {8C9B862A-B569-460C-8B74-E74C6DF0CAB3} - {57D0570C-7B6A-4795-960E-D37E9FFDA066} = {8C9B862A-B569-460C-8B74-E74C6DF0CAB3} - {05F54420-1410-4240-9287-F410A24130E1} = {0CB3AF52-50F3-4728-BAC6-389F2E995111} - {5FAA826B-DD53-488D-A9C4-1950B1D4DF2E} = {0CB3AF52-50F3-4728-BAC6-389F2E995111} - {3590A83D-8992-4A96-AC42-9704098C46ED} = {64F66ABD-6398-417B-95D7-A8B51077FB3C} - {2FFCB9ED-F02E-4C26-9551-74EDE27E3DD4} = {64F66ABD-6398-417B-95D7-A8B51077FB3C} - {806EDCE9-74E4-41F3-9E97-74317EB209B3} = {57D0570C-7B6A-4795-960E-D37E9FFDA066} - {B810A41B-66BC-4FD4-B78E-CBFA0CF96A33} = {57D0570C-7B6A-4795-960E-D37E9FFDA066} - {4DFD079F-2353-48A1-BDC7-1711491CB82C} = {57D0570C-7B6A-4795-960E-D37E9FFDA066} + {64F66ABD-6398-417B-95D7-A8B51077FB3C} = {B0EBDE47-FE8A-4BC6-A4EE-767CD405BB06} + {57D0570C-7B6A-4795-960E-D37E9FFDA066} = {B0EBDE47-FE8A-4BC6-A4EE-767CD405BB06} + {B0EBDE47-FE8A-4BC6-A4EE-767CD405BB06} = {8C9B862A-B569-460C-8B74-E74C6DF0CAB3} + {6A64FCC4-0E19-4181-ABD8-D951DB6B75E9} = {8C9B862A-B569-460C-8B74-E74C6DF0CAB3} + {A6A252E0-BC83-43D1-A118-371721F1A5D4} = {8C9B862A-B569-460C-8B74-E74C6DF0CAB3} + {02D796A3-A9FB-4E9C-972C-50B173DE213C} = {57D0570C-7B6A-4795-960E-D37E9FFDA066} + {CE5B5331-3F4F-412F-8169-8DA1D37170C6} = {57D0570C-7B6A-4795-960E-D37E9FFDA066} + {1A79A124-5C6D-456E-8402-33A1FA68C566} = {57D0570C-7B6A-4795-960E-D37E9FFDA066} + {5A914466-79DF-4F6E-8A8F-829CBDCDFFDE} = {0CB3AF52-50F3-4728-BAC6-389F2E995111} + {0A6025A4-97ED-4F67-9B49-82B417BCB81F} = {0CB3AF52-50F3-4728-BAC6-389F2E995111} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3004E730-B231-40FA-B75C-58D7DDE17679} diff --git a/samples/HotReloadSample/HotReloadSample.csproj b/samples/HotReloadSample/HotReloadSample.csproj index 9ee4c8fc..12091e33 100644 --- a/samples/HotReloadSample/HotReloadSample.csproj +++ b/samples/HotReloadSample/HotReloadSample.csproj @@ -11,7 +11,8 @@ - + + diff --git a/samples/HotReloadSample/Program.cs b/samples/HotReloadSample/Program.cs index e7fb352e..6adcb223 100644 --- a/samples/HotReloadSample/Program.cs +++ b/samples/HotReloadSample/Program.cs @@ -116,7 +116,7 @@ private static void HotReloadService_UpdateApplicationEvent(Type[]? obj) Console.WriteLine(obj==null); } - public static Assembly OldAssembly(NatashaReferenceDomain domain) + public static Assembly OldAssembly(NatashaLoadContext domain) { AssemblyCSharpBuilder builder = new AssemblyCSharpBuilder { @@ -126,7 +126,7 @@ public static Assembly OldAssembly(NatashaReferenceDomain domain) return builder.GetAssembly(); } - public static Assembly NewAssembly(NatashaReferenceDomain domain) + public static Assembly NewAssembly(NatashaLoadContext domain) { AssemblyCSharpBuilder builder = new AssemblyCSharpBuilder(); builder.Domain = domain; diff --git a/samples/ReferenceSample/Program.cs b/samples/ReferenceSample/Program.cs index a7230664..036ecfee 100644 --- a/samples/ReferenceSample/Program.cs +++ b/samples/ReferenceSample/Program.cs @@ -31,8 +31,9 @@ static void Main(string[] args) //var a = typeof(CodecovMonitor); //var b = typeof(A); //NatashaManagement.Preheating(true, true); - TestMini1(); - TestMini1(); + NatashaManagement.RegistDomainCreator(); + TestMini(); + TestMini(); //var a = Math.Min(1, args.Length); //NatashaManagement.Preheating(false, false); //Console.WriteLine("============================="); @@ -250,7 +251,7 @@ public static void Run1() builder.ConfigCompilerOption(item => item.AddSupperess("CS0108")); builder.WithoutAnalysisAccessibility(); - builder.Domain = DomainManagement.Random(); + builder.LoadContext = DomainManagement.Random(); builder.Add("public class A { public string Name {get;set;} = \"abc\"; }", UsingLoadBehavior.WithDefault); diff --git a/samples/ReferenceSample/ReferenceSample.csproj b/samples/ReferenceSample/ReferenceSample.csproj index 1de9b7ed..357a66d1 100644 --- a/samples/ReferenceSample/ReferenceSample.csproj +++ b/samples/ReferenceSample/ReferenceSample.csproj @@ -38,7 +38,8 @@ - + + diff --git a/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Compiler.Domain/Natasha.CSharp.Compiler.Domain.csproj b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Compiler.Domain/Natasha.CSharp.Compiler.Domain.csproj new file mode 100644 index 00000000..e52ce9dd --- /dev/null +++ b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Compiler.Domain/Natasha.CSharp.Compiler.Domain.csproj @@ -0,0 +1,19 @@ + + + + netcoreapp3.1;net5.0;net6.0;net7.0;net8.0; + true + Natasha 的编译域实现. + DotNetCore.Natasha.CSharp.Compiler.Domain + 升级到最新版. + Natasha;NMS;Template;Compile;Domain;LoadContext; + 8.0.0.0 + 8.0.0.0 + 8.0.0.0 + + + + + + + diff --git a/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Compiler.Domain/NatashaCompilerDomain.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Compiler.Domain/NatashaCompilerDomain.cs new file mode 100644 index 00000000..a7f4f309 --- /dev/null +++ b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Compiler.Domain/NatashaCompilerDomain.cs @@ -0,0 +1,37 @@ +using Natasha.DynamicLoad.Base; + +/// +/// Natasha域实现 +/// C# 的引用代码是通过 Using 来完成的,该域实现增加了 Using 记录 +/// +public class NatashaCompilerDomain : NatashaDomain, INatashaDynamicLoadContextBase +{ + + public NatashaCompilerDomain() : base() + { + + } + public NatashaCompilerDomain(string key) : base(key) + { + + } + + + public override void Dispose() + { + _caller = null; + base.Dispose(); + } + + + private object? _caller; + public object? GetCallerReference() + { + return _caller; + } + + public void SetCallerReference(object instance) + { + _caller = instance; + } +} diff --git a/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Compiler.Domain/NatashaDomainCreator.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Compiler.Domain/NatashaDomainCreator.cs new file mode 100644 index 00000000..5be3dd69 --- /dev/null +++ b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Compiler.Domain/NatashaDomainCreator.cs @@ -0,0 +1,45 @@ +using Natasha.DynamicLoad.Base; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Reflection.Metadata; +using System.Runtime.Loader; + +public class NatashaDomainCreator : INatashaDynamicLoadContextCreator +{ + public INatashaDynamicLoadContextBase CreateContext(string key) + { + return new NatashaCompilerDomain(key); + } + + public INatashaDynamicLoadContextBase CreateDefaultContext() + { + return new NatashaCompilerDomain(); + } + + public IEnumerable? GetDependencyAssemblies(Assembly assembly) + { + var assemblyDomain = AssemblyLoadContext.GetLoadContext(assembly); + if (assemblyDomain != null) + { + return assembly.GetReferencedAssemblies().Select(asmName => assemblyDomain.LoadFromAssemblyName(asmName)); + } + return null; + } + + public INatashaDynamicLoadContextBase? GetDomain(Assembly assembly) + { + var assemblyDomain = AssemblyLoadContext.GetLoadContext(assembly); + if (assemblyDomain != null) + { + return (NatashaCompilerDomain)assemblyDomain; + } + return null; + } + + public unsafe bool TryGetRawMetadata(Assembly assembly, out byte* blob, out int length) + { + return assembly.TryGetRawMetadata(out blob, out length); + } +} + diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/ConstraintBuilder.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/ConstraintBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/ConstraintBuilder.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/ConstraintBuilder.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/CtorBuilder.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/CtorBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/CtorBuilder.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/CtorBuilder.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/DelegateBuilder.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/DelegateBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/DelegateBuilder.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/DelegateBuilder.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/FieldBuilder.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/FieldBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/FieldBuilder.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/FieldBuilder.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/MethodBuilder.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/MethodBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/MethodBuilder.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/MethodBuilder.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/OopBuilder.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/OopBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/OopBuilder.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/OopBuilder.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/PropertyBuilder.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/PropertyBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Builder/PropertyBuilder.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Builder/PropertyBuilder.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/DelegateImplementationHelper.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/DelegateImplementationHelper.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/DelegateImplementationHelper.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/DelegateImplementationHelper.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level1/Operator/FakeMethodOperator.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level1/Operator/FakeMethodOperator.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level1/Operator/FakeMethodOperator.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level1/Operator/FakeMethodOperator.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level1/Operator/FastMethodOperator.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level1/Operator/FastMethodOperator.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level1/Operator/FastMethodOperator.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level1/Operator/FastMethodOperator.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Deconstruct/DString.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Deconstruct/DString.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Deconstruct/DString.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Deconstruct/DString.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NClass.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NClass.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NClass.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NClass.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NDelegate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NDelegate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NDelegate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NDelegate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NEnum.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NEnum.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NEnum.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NEnum.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NHandler.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NHandler.cs similarity index 59% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NHandler.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NHandler.cs index d33601f8..f42072c6 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NHandler.cs +++ b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NHandler.cs @@ -8,25 +8,25 @@ namespace Natasha.CSharp public NDelegate DelegateHandler { - get { return NDelegate.UseDomain(AssemblyBuilder.Domain); } + get { return NDelegate.UseDomain(AssemblyBuilder.LoadContext); } } public NClass ClassHandler { - get { return NClass.UseDomain(AssemblyBuilder.Domain).Using(NamespaceScript); } + get { return NClass.UseDomain(AssemblyBuilder.LoadContext).Using(NamespaceScript); } } public NInterface InterfaceHandler { - get { return NInterface.UseDomain(AssemblyBuilder.Domain).Using(NamespaceScript); } + get { return NInterface.UseDomain(AssemblyBuilder.LoadContext).Using(NamespaceScript); } } public NEnum EnumHandler { - get { return NEnum.UseDomain(AssemblyBuilder.Domain).Using(NamespaceScript); } + get { return NEnum.UseDomain(AssemblyBuilder.LoadContext).Using(NamespaceScript); } } diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NInterface.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NInterface.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NInterface.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NInterface.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NRecord.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NRecord.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NRecord.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NRecord.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NStruct.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NStruct.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level2/Operator/NStruct.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level2/Operator/NStruct.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level3/NInstance.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level3/NInstance.cs similarity index 64% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level3/NInstance.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level3/NInstance.cs index 7c7450cc..2aab8259 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/Level3/NInstance.cs +++ b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/Level3/NInstance.cs @@ -8,7 +8,7 @@ public static class NInstance public static Func Creator() { - return NDelegate.UseDomain(typeof(T).GetDomain()).Func($"return new {typeof(T).GetDevelopName()}();"); + return NDelegate.UseDomain(DomainManagement.Create(typeof(T).GetDomain()!.Name)).Func($"return new {typeof(T).GetDevelopName()}();"); } @@ -19,7 +19,7 @@ public static Delegate Creator(Type type) { return FastMethodOperator - .UseDomain(type.GetDomain()) + .UseDomain(DomainManagement.Create(type.GetDomain()!.Name)) .Body($"return new {type.GetDevelopName()}();") .Return(type) .Compile(); diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/NatashaOperator.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/NatashaOperator.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/API/NatashaOperator.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/API/NatashaOperator.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/AccessTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/AccessTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/AccessTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/AccessTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/AttributeTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/AttributeTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/AttributeTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/AttributeTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/CommentTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/CommentTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/CommentTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/CommentTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/DefinedNameTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/DefinedNameTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/DefinedNameTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/DefinedNameTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/DefinedNullableTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/DefinedNullableTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/DefinedNullableTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/DefinedNullableTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/DefinedTypeTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/DefinedTypeTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/DefinedTypeTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/DefinedTypeTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Extension/Inner/ReflectionInfoExtension.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Extension/Inner/ReflectionInfoExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Extension/Inner/ReflectionInfoExtension.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Extension/Inner/ReflectionInfoExtension.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Extension/Inner/StopwatchExtension.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Extension/Inner/StopwatchExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Extension/Inner/StopwatchExtension.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Extension/Inner/StopwatchExtension.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/Inner/SyntaxNodeExtension.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Extension/Inner/SyntaxNodeExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/Inner/SyntaxNodeExtension.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Extension/Inner/SyntaxNodeExtension.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Field/FieldTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Field/FieldTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Field/FieldTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Field/FieldTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Method/DelegateTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Method/DelegateTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Method/DelegateTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Method/DelegateTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Method/MethodBodyTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Method/MethodBodyTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Method/MethodBodyTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Method/MethodBodyTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Method/MethodConstraintTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Method/MethodConstraintTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Method/MethodConstraintTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Method/MethodConstraintTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Method/ParameterTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Method/ParameterTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Method/ParameterTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Method/ParameterTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/ModifierTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/ModifierTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/ModifierTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/ModifierTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Natasha.CSharp.Template.csproj b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Natasha.CSharp.Template.Core.csproj similarity index 90% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Natasha.CSharp.Template.csproj rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Natasha.CSharp.Template.Core.csproj index 43bc5aa9..f27cba59 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Natasha.CSharp.Template.csproj +++ b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Natasha.CSharp.Template.Core.csproj @@ -5,15 +5,13 @@ Natasha 的编译模板 DotNetCore.Natasha.CSharp.Template 升级到最新版. - Roslyn;IL;Script;Dynamic;Natasha;NMS;Template + Roslyn;Script;Dynamic;Natasha;NMS;Template; true - 5.2.2.1 - 5.2.2.1 - 5.2.2.1 + 8.0.0.0 + 8.0.0.0 + 8.0.0.0 - - - + @@ -31,4 +29,8 @@ + + + + diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/Extension/OopDefinedTypeExtension.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/Extension/OopDefinedTypeExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/Extension/OopDefinedTypeExtension.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/Extension/OopDefinedTypeExtension.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/FlagTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/FlagTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/FlagTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/FlagTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/InheritanceTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/InheritanceTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/InheritanceTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/InheritanceTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/NamespaceBodyTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/NamespaceBodyTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/NamespaceBodyTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/NamespaceBodyTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/NamespaceTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/NamespaceTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/NamespaceTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/NamespaceTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/OopBodyTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/OopBodyTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/OopBodyTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/OopBodyTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/OopConstraintTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/OopConstraintTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/OopConstraintTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/OopConstraintTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/UsingTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/UsingTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Oop/UsingTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Oop/UsingTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Property/PropertyTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Property/PropertyTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Property/PropertyTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Property/PropertyTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/AccessReverser.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/AccessReverser.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/AccessReverser.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/AccessReverser.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/AsyncReverser.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/AsyncReverser.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/AsyncReverser.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/AsyncReverser.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/AvailableNameReverser.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/AvailableNameReverser.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/AvailableNameReverser.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/AvailableNameReverser.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/DeclarationReverser.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/DeclarationReverser.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/DeclarationReverser.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/DeclarationReverser.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/GenericConstraintReverser.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/GenericConstraintReverser.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/GenericConstraintReverser.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/GenericConstraintReverser.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/Model/AccessTypes.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/Model/AccessTypes.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/Model/AccessTypes.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/Model/AccessTypes.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/Model/ConstraintFlags.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/Model/ConstraintFlags.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/Model/ConstraintFlags.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/Model/ConstraintFlags.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/Model/ModifierFlags.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/Model/ModifierFlags.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/Model/ModifierFlags.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/Model/ModifierFlags.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/ModifierReverser.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/ModifierReverser.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/ModifierReverser.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/ModifierReverser.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/NET50OR31/NullabilityInfo.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/NET50OR31/NullabilityInfo.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/NET50OR31/NullabilityInfo.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/NET50OR31/NullabilityInfo.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/NET50OR31/NullabilityInfoContext.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/NET50OR31/NullabilityInfoContext.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/NET50OR31/NullabilityInfoContext.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/NET50OR31/NullabilityInfoContext.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/NET50OR31/NullabilityState.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/NET50OR31/NullabilityState.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/NET50OR31/NullabilityState.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/NET50OR31/NullabilityState.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/NullableMemberReverser.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/NullableMemberReverser.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/NullableMemberReverser.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/NullableMemberReverser.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/NullableNatashaExtension.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/NullableNatashaExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/NullableNatashaExtension.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/NullableNatashaExtension.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/UnsafeReverser.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/UnsafeReverser.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Reverser/UnsafeReverser.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Reverser/UnsafeReverser.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Standard/ComplierTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Standard/ComplierTemplate.cs similarity index 91% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Standard/ComplierTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Standard/ComplierTemplate.cs index 6b3cd904..8662c161 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Standard/ComplierTemplate.cs +++ b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Standard/ComplierTemplate.cs @@ -49,7 +49,7 @@ public T SetAssemblyName(string name) public static T UseCompiler(AssemblyCSharpBuilder builder, Action? option = default) { - return UseDomain(builder.Domain, option); + return UseDomain(builder.LoadContext, option); } #endregion @@ -85,7 +85,7 @@ public static T CreateDomain(string domainName, Action? o if (domainName.ToLower() == "default") { - return UseDomain(NatashaReferenceDomain.DefaultDomain, option); + return UseDomain(NatashaLoadContext.DefaultContext, option); } else { @@ -112,11 +112,11 @@ public static T UseScope() /// 使用一个域来初始化编译单元 /// /// - public static T UseDomain(NatashaReferenceDomain domain, Action? option = default) + public static T UseDomain(NatashaLoadContext loadContext, Action? option = default) { T instance = new(); - instance.AssemblyBuilder.Domain = domain; + instance.AssemblyBuilder.LoadContext = loadContext; instance.OptionAction = option; option?.Invoke(instance.AssemblyBuilder); return instance; @@ -133,7 +133,7 @@ public static T UseDomain(NatashaReferenceDomain domain, Action? option = default) { - return UseDomain(NatashaReferenceDomain.DefaultDomain, option); + return UseDomain(NatashaLoadContext.DefaultContext, option); } diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Standard/GlobalUsingTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Standard/GlobalUsingTemplate.cs similarity index 97% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Standard/GlobalUsingTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Standard/GlobalUsingTemplate.cs index 6ec1c3cb..5a8e917c 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Standard/GlobalUsingTemplate.cs +++ b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Standard/GlobalUsingTemplate.cs @@ -1,4 +1,4 @@ -using Natasha.CSharp.Using; +using Natasha.CSharp.Compiler.Component; using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Standard/LinkTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Standard/LinkTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Standard/LinkTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Standard/LinkTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Standard/ScriptTemplate.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Standard/ScriptTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Standard/ScriptTemplate.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Standard/ScriptTemplate.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Targets/Project.Usings.targets b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Targets/Project.Usings.targets similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Targets/Project.Usings.targets rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Targets/Project.Usings.targets diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/Model/Core31Supplement.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Utils/Core31Supplement.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/Model/Core31Supplement.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Utils/Core31Supplement.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Utils/IgnoresAccessChecksToAttribute.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Utils/IgnoresAccessChecksToAttribute.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Utils/IgnoresAccessChecksToAttribute.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Utils/IgnoresAccessChecksToAttribute.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Utils/NamespaceConverter.cs b/src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Utils/NamespaceConverter.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Utils/NamespaceConverter.cs rename to src/Natasha.CSharp/Component/Core/Natasha.CSharp.Template.Core/Utils/NamespaceConverter.cs diff --git a/src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Default.cs b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Default.cs similarity index 60% rename from src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Default.cs rename to src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Default.cs index 38cc5c2c..7b8f6107 100644 --- a/src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Default.cs +++ b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Default.cs @@ -1,5 +1,4 @@ -using Natasha.Domain.Extension; -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; @@ -13,7 +12,6 @@ public partial class NatashaDomain : AssemblyLoadContext { private readonly static ConcurrentDictionary _defaultAssemblyNameCache; private readonly static HashSet _defaultAssembliesSets; - private static Func? _excludeDefaultAssembliesFunc; public static readonly NatashaDomain DefaultDomain; static NatashaDomain() @@ -48,31 +46,15 @@ private static void ReleaseLock() _lockCount = 0; } - - - public static void SetDefaultAssemblyFilter(Func? excludeAssemblyNameFunc) - { - _excludeDefaultAssembliesFunc = excludeAssemblyNameFunc; - } - public static void AddAssemblyToDefaultCache(Assembly assembly) { var asmName = assembly.GetName(); - if (_excludeDefaultAssembliesFunc == null || !_excludeDefaultAssembliesFunc(asmName, asmName.Name)) - { - _defaultAssemblyNameCache[asmName.GetUniqueName()] = asmName; - lock (_defaultAssembliesSets) - { - _defaultAssembliesSets.Add(assembly); - } - } - else + _defaultAssemblyNameCache[asmName.GetUniqueName()] = asmName; + lock (_defaultAssembliesSets) { -#if DEBUG - System.Diagnostics.Debug.WriteLine("[排除程序集]:" + asmName.FullName); -#endif + _defaultAssembliesSets.Add(assembly); } } @@ -81,13 +63,13 @@ private static void CheckAndIncrmentAssemblies() { if (GetLock()) { - - var assemblies = DefaultDomain.Assemblies; + //var result = (AssemblyLoadContext)DefaultDomain == AssemblyLoadContext.Default!; + var assemblies = Default.Assemblies; var count = assemblies.Count(); if (count != _preDefaultAssemblyCount) { _preDefaultAssemblyCount = count; - HashSet checkAsm = new(DefaultDomain.Assemblies); + HashSet checkAsm = new(Default.Assemblies); lock (_defaultAssembliesSets) { checkAsm.ExceptWith(_defaultAssembliesSets); @@ -95,17 +77,8 @@ private static void CheckAndIncrmentAssemblies() { var asmName = item.GetName(); - if (_excludeDefaultAssembliesFunc == null || !_excludeDefaultAssembliesFunc(asmName, asmName.Name)) - { - _defaultAssemblyNameCache[asmName.GetUniqueName()] = asmName; - _defaultAssembliesSets.Add(item); - } -#if DEBUG - else - { - System.Diagnostics.Debug.WriteLine("[排除程序集]:" + asmName.FullName); - } -#endif + _defaultAssemblyNameCache[asmName.GetUniqueName()] = asmName; + _defaultAssembliesSets.Add(item); } } } @@ -118,7 +91,6 @@ private static void CheckAndIncrmentAssemblies() public static int DefaultAssemblyCacheCount { get{ return _preDefaultAssemblyCount; } } public static void RefreshDefaultAssemblies(Func? excludeAssemblyNameFunc) { - SetDefaultAssemblyFilter(excludeAssemblyNameFunc); CheckAndIncrmentAssemblies(); } diff --git a/src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Event.cs b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Event.cs similarity index 56% rename from src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Event.cs rename to src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Event.cs index 758fa701..4b329ae8 100644 --- a/src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Event.cs +++ b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Event.cs @@ -23,16 +23,4 @@ private IntPtr Default_ResolvingUnmanagedDll(Assembly arg1, string arg2) return LoadUnmanagedDll(arg2); } - /// - /// 当动态编译或者插件文件加载后,对文件和程序集如何处理 - /// - protected event Action? LoadAssemblyReferencsWithPath; - /// - /// 当动态编译或者插件流加载后,对流和程序集如何处理 - /// - - protected event Action? LoadAssemblyReferenceWithStream; - - - } diff --git a/src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Load.cs b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Load.cs similarity index 81% rename from src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Load.cs rename to src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Load.cs index ca1e954d..6d042933 100644 --- a/src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Load.cs +++ b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Load.cs @@ -1,11 +1,11 @@ -using Natasha.CSharp.Component.Domain; -using Natasha.Domain.Extension; +using Natasha.CSharp.Component.Load; using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.Loader; +using System.Xml.Linq; /// /// Natasha域实现 @@ -74,7 +74,6 @@ public virtual Assembly LoadAssemblyFromFile(string path) assembly = LoadFromAssemblyPath(path); } } - LoadAssemblyReferencsWithPath?.Invoke(assembly, path); return assembly; } @@ -101,9 +100,6 @@ public virtual Assembly LoadAssemblyFromStream(Stream dllStream, Stream? pdbStre { assembly = LoadFromStream(dllStream, pdbStream); } - - dllStream.Seek(0, SeekOrigin.Begin); - LoadAssemblyReferenceWithStream?.Invoke(assembly, dllStream); return assembly; } @@ -119,59 +115,66 @@ public virtual Assembly LoadAssemblyFromStream(Stream dllStream, Stream? pdbStre #if DEBUG Debug.WriteLine($"[解析]程序集:{assemblyName.Name},全名:{assemblyName.FullName}"); #endif + var result = _excludePluginReferencesFunc(assemblyName); if (AssemblyLoadBehavior != AssemblyCompareInfomation.None && Name != "Default") { var name = assemblyName.GetUniqueName(); #if DEBUG - Debug.WriteLine($"\t[当前域匹配]程序集唯一名称:{assemblyName.Name}!"); + Debug.WriteLine($"\t[当前域解析]程序集唯一名称:{assemblyName.Name}!"); #endif //当前域检测 var preAssembly = this.Assemblies.FirstOrDefault(asm => asm.GetName().GetUniqueName() == name); if (preAssembly != null) { +#if DEBUG + Debug.WriteLine($"\t\t使用之前的依赖:{preAssembly.FullName}!"); +#endif return preAssembly; } //默认域覆盖检测 - if (_defaultAssemblyNameCache.TryGetValue(name!, out var defaultCacheName)) + if (_defaultAssemblyNameCache.TryGetValue(name!, out var defaultAsmName)) { #if DEBUG - Debug.WriteLine($"\t\t[匹配成功]源/默认域版本:{assemblyName.Version}/{defaultCacheName.Version}!"); + Debug.WriteLine($"\t\t[匹配成功]源/共享域版本:{assemblyName.Version}/{defaultAsmName.Version}!"); #endif - if (assemblyName.CompareWithDefault(defaultCacheName, AssemblyLoadBehavior) == AssemblyLoadVersionResult.UseDefault) + if (result || assemblyName.CompareWithDefault(defaultAsmName, AssemblyLoadBehavior) == AssemblyLoadVersionResult.UseDefault) { var defaultAsm = Default.Assemblies.FirstOrDefault(asm => asm.GetName().GetUniqueName() == name); if (defaultAsm != null) { +#if DEBUG + if (result) + { + Debug.WriteLine($"\t由于被排除,使用共享域版本:{defaultAsmName.Version}!"); + } + else + { + Debug.WriteLine($"\t使用共享域版本:{defaultAsmName.Version}!"); + } + +#endif return defaultAsm; } } } //var asm = this.LoadFromAssemblyName(assemblyName);//死循环代码 } - var result = _excludePluginReferencesFunc(assemblyName); if (!result) { string? assemblyPath = _dependencyResolver!.ResolveAssemblyToPath(assemblyName); if (assemblyPath != null && File.Exists(assemblyPath)) { +#if DEBUG + Debug.WriteLine($"\t[文件依赖解析]依赖路径:{assemblyPath}!"); +#endif return LoadAssemblyFromFile(assemblyPath); } - //if (!string.IsNullOrEmpty(assemblyName.CultureName) && !string.Equals("neutral", assemblyName.CultureName)) - //{ - // foreach (var resourceRoot in _resourceRoots) - // { - // var resourcePath = Path.Combine(resourceRoot, assemblyName.CultureName, assemblyName.Name + ".dll"); - // if (File.Exists(resourcePath)) - // { - // return LoadAssemblyFromFile(resourcePath); - // } - // } - - // return null; - //} } +#if DEBUG + Debug.WriteLine($"\t使用当前域版本:{assemblyName.FullName}!"); +#endif return null; } diff --git a/src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Plugin.cs b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Plugin.cs similarity index 87% rename from src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Plugin.cs rename to src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Plugin.cs index cacfafca..6c26ee78 100644 --- a/src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.Plugin.cs +++ b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.Plugin.cs @@ -12,7 +12,7 @@ public partial class NatashaDomain /// 插件路径,会自动加载同路径下的 pdb 文件. /// 不需要加载的依赖项 /// - internal Assembly LoadPlugin(string path, Func? excludeAssembliesFunc = null) + public Assembly LoadPlugin(string path, Func? excludeAssembliesFunc = null) { if (excludeAssembliesFunc!=null) diff --git a/src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.cs b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.cs similarity index 85% rename from src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.cs rename to src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.cs index 900fe30d..1a541efb 100644 --- a/src/Natasha.CSharp/Core/Natasha.Domain/Core/NatashaDomain.cs +++ b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Core/NatashaDomain.cs @@ -1,4 +1,6 @@ -using System; +using Natasha.DynamicLoad.Base; +using System; +using System.Net.Http.Headers; using System.Runtime.CompilerServices; using System.Runtime.Loader; @@ -9,7 +11,7 @@ /// Natasha域实现 /// C# 的引用代码是通过 Using 来完成的,该域实现增加了 Using 记录 /// -public partial class NatashaDomain : AssemblyLoadContext, IDisposable +public partial class NatashaDomain : AssemblyLoadContext,IDisposable { protected NatashaDomain() : base("Default") @@ -21,6 +23,7 @@ protected NatashaDomain() : base("Default") _excludePluginReferencesFunc = item => false; _dependencyResolver = new AssemblyDependencyResolver(AppDomain.CurrentDomain.BaseDirectory!); Unsafe.AsRef(in DefaultDomain) = this; + CheckAndIncrmentAssemblies(); } public NatashaDomain(string key) : base(key, true) @@ -28,7 +31,7 @@ public NatashaDomain(string key) : base(key, true) if (key == "Default") { - throw new Exception("不能重复创建主域!"); + throw new Exception("不可重复创建共享域!"); } AssemblyLoadBehavior = AssemblyCompareInfomation.None; @@ -37,19 +40,8 @@ public NatashaDomain(string key) : base(key, true) } - - public void Dispose() + public virtual void Dispose() { - Dispose(true); GC.SuppressFinalize(this); } - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - - } - } - } diff --git a/src/Natasha.CSharp/Core/Natasha.Domain/Extension/NatashaDomainExtension.cs b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Extension/NatashaDomainExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.Domain/Extension/NatashaDomainExtension.cs rename to src/Natasha.CSharp/Component/Core/Natasha.Domain/Extension/NatashaDomainExtension.cs diff --git a/src/Natasha.CSharp/Component/Core/Natasha.Domain/Natasha.Domain.csproj b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Natasha.Domain.csproj new file mode 100644 index 00000000..2bd06940 --- /dev/null +++ b/src/Natasha.CSharp/Component/Core/Natasha.Domain/Natasha.Domain.csproj @@ -0,0 +1,19 @@ + + + + netcoreapp3.1;net5.0;net6.0;net7.0;net8.0; + Natasha 程序集域 Core 版本的实现,插件编程. + DotNetCore.Natasha.Domain + 升级 + Natasha;Domain;ALC;Domain;Plugin; + true + 8.0.0.0 + 8.0.0.0 + 8.0.0.0 + + + + + + + \ No newline at end of file diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/ConstraintBuilder.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/ConstraintBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/ConstraintBuilder.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/ConstraintBuilder.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/CtorBuilder.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/CtorBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/CtorBuilder.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/CtorBuilder.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/DelegateBuilder.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/DelegateBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/DelegateBuilder.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/DelegateBuilder.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/FieldBuilder.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/FieldBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/FieldBuilder.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/FieldBuilder.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/MethodBuilder.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/MethodBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/MethodBuilder.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/MethodBuilder.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/OopBuilder.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/OopBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/OopBuilder.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/OopBuilder.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/PropertyBuilder.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/PropertyBuilder.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Builder/PropertyBuilder.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Builder/PropertyBuilder.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/DelegateImplementationHelper.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/DelegateImplementationHelper.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/DelegateImplementationHelper.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/DelegateImplementationHelper.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level1/Operator/FakeMethodOperator.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level1/Operator/FakeMethodOperator.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level1/Operator/FakeMethodOperator.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level1/Operator/FakeMethodOperator.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level1/Operator/FastMethodOperator.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level1/Operator/FastMethodOperator.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level1/Operator/FastMethodOperator.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level1/Operator/FastMethodOperator.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Deconstruct/DString.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Deconstruct/DString.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Deconstruct/DString.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Deconstruct/DString.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NClass.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NClass.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NClass.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NClass.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NDelegate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NDelegate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NDelegate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NDelegate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NEnum.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NEnum.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NEnum.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NEnum.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NHandler.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NHandler.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NHandler.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NHandler.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NInterface.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NInterface.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NInterface.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NInterface.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NRecord.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NRecord.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NRecord.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NRecord.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NStruct.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NStruct.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NStruct.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/Level2/Operator/NStruct.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/NatashaOperator.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/NatashaOperator.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/API/NatashaOperator.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/API/NatashaOperator.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/AccessTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/AccessTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/AccessTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/AccessTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/AttributeTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/AttributeTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/AttributeTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/AttributeTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/CommentTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/CommentTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/CommentTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/CommentTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/DefinedNameTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/DefinedNameTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/DefinedNameTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/DefinedNameTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/DefinedNullableTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/DefinedNullableTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/DefinedNullableTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/DefinedNullableTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/DefinedTypeTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/DefinedTypeTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/DefinedTypeTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/DefinedTypeTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/ReflectionInfoExtension.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/ReflectionInfoExtension.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/ReflectionInfoExtension.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/ReflectionInfoExtension.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/StopwatchExtension.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/StopwatchExtension.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/StopwatchExtension.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/StopwatchExtension.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Template/Extension/Inner/SyntaxNodeExtension.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/SyntaxNodeExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Template/Extension/Inner/SyntaxNodeExtension.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/SyntaxNodeExtension.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Field/FieldTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Field/FieldTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Field/FieldTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Field/FieldTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Method/DelegateTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Method/DelegateTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Method/DelegateTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Method/DelegateTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Method/MethodBodyTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Method/MethodBodyTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Method/MethodBodyTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Method/MethodBodyTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Method/MethodConstraintTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Method/MethodConstraintTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Method/MethodConstraintTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Method/MethodConstraintTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Method/ParameterTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Method/ParameterTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Method/ParameterTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Method/ParameterTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/ModifierTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/ModifierTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/ModifierTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/ModifierTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Natasha.CSharp.Template.Framework.csproj b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Natasha.CSharp.Template.Framework.csproj similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Natasha.CSharp.Template.Framework.csproj rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Natasha.CSharp.Template.Framework.csproj diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/Extension/OopDefinedTypeExtension.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/Extension/OopDefinedTypeExtension.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/Extension/OopDefinedTypeExtension.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/Extension/OopDefinedTypeExtension.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/FlagTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/FlagTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/FlagTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/FlagTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/InheritanceTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/InheritanceTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/InheritanceTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/InheritanceTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/NamespaceBodyTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/NamespaceBodyTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/NamespaceBodyTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/NamespaceBodyTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/NamespaceTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/NamespaceTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/NamespaceTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/NamespaceTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/OopBodyTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/OopBodyTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/OopBodyTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/OopBodyTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/OopConstraintTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/OopConstraintTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/OopConstraintTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/OopConstraintTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/UsingTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/UsingTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Oop/UsingTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Oop/UsingTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Property/PropertyTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Property/PropertyTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Property/PropertyTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Property/PropertyTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/AccessReverser.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/AccessReverser.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/AccessReverser.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/AccessReverser.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/AsyncReverser.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/AsyncReverser.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/AsyncReverser.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/AsyncReverser.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/AvailableNameReverser.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/AvailableNameReverser.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/AvailableNameReverser.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/AvailableNameReverser.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/DeclarationReverser.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/DeclarationReverser.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/DeclarationReverser.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/DeclarationReverser.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/GenericConstraintReverser.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/GenericConstraintReverser.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/GenericConstraintReverser.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/GenericConstraintReverser.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/AccessTypes.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/AccessTypes.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/AccessTypes.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/AccessTypes.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/ConstraintFlags.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/ConstraintFlags.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/ConstraintFlags.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/ConstraintFlags.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/ModifierFlags.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/ModifierFlags.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/ModifierFlags.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/Model/ModifierFlags.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/ModifierReverser.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/ModifierReverser.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/ModifierReverser.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/ModifierReverser.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityInfo.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityInfo.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityInfo.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityInfo.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityInfoContext.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityInfoContext.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityInfoContext.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityInfoContext.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityState.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityState.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityState.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/NET50OR31/NullabilityState.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/NullableMemberReverser.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/NullableMemberReverser.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/NullableMemberReverser.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/NullableMemberReverser.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/NullableNatashaExtension.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/NullableNatashaExtension.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/NullableNatashaExtension.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/NullableNatashaExtension.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/UnsafeReverser.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/UnsafeReverser.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Reverser/UnsafeReverser.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Reverser/UnsafeReverser.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Standard/ComplierTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Standard/ComplierTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Standard/ComplierTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Standard/ComplierTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Standard/GlobalUsingTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Standard/GlobalUsingTemplate.cs similarity index 98% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Standard/GlobalUsingTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Standard/GlobalUsingTemplate.cs index 6ec1c3cb..1f7a9ea6 100644 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Standard/GlobalUsingTemplate.cs +++ b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Standard/GlobalUsingTemplate.cs @@ -1,4 +1,4 @@ -using Natasha.CSharp.Using; +using Natasha.CSharp.Component; using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Standard/LinkTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Standard/LinkTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Standard/LinkTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Standard/LinkTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Standard/ScriptTemplate.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Standard/ScriptTemplate.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Standard/ScriptTemplate.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Standard/ScriptTemplate.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Targets/Project.Usings.targets b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Targets/Project.Usings.targets similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Targets/Project.Usings.targets rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Targets/Project.Usings.targets diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Utils/IgnoresAccessChecksToAttribute.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Utils/IgnoresAccessChecksToAttribute.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Utils/IgnoresAccessChecksToAttribute.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Utils/IgnoresAccessChecksToAttribute.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Utils/NamespaceConverter.cs b/src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Utils/NamespaceConverter.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Utils/NamespaceConverter.cs rename to src/Natasha.CSharp/Component/Framework/Natasha.CSharp.Template.Framework/Utils/NamespaceConverter.cs diff --git a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Natasha.CSharp.Codecov.csproj b/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Natasha.CSharp.Codecov.csproj deleted file mode 100644 index a8eb42c7..00000000 --- a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Natasha.CSharp.Codecov.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - netcoreapp3.1;net6.0;net8.0; - enable - enable - true - - - - - - diff --git a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/AmbiguityUsingsCompilationExtension.cs b/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/AmbiguityUsingsCompilationExtension.cs deleted file mode 100644 index f35d57ae..00000000 --- a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/AmbiguityUsingsCompilationExtension.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Natasha.CSharp.Builder; -using Natasha.CSharp.Extension.Ambiguity; - - -public static class AmbiguityUsingsCompilationExtension -{ - public static NDelegate WithCS0104Handler(this NDelegate template) - { - template.AssemblyBuilder.AddSemanticAnalysistor(AmbiguityUsings.NDelegateCreator(template)); - return template; - } - public static T WithCS0104Handler(this MethodBuilder builder) where T : MethodBuilder, new() - { - builder.AssemblyBuilder.AddSemanticAnalysistor(AmbiguityUsings.MethodBuilderCreator(builder)); - return builder.Link!; - } - public static T WithCS0104Handler(this OopBuilder builder) where T : OopBuilder, new() - { - builder.AssemblyBuilder.AddSemanticAnalysistor(AmbiguityUsings.OopBuilderCreator(builder)); - return builder.Link!; - } - - //public static T WithCS0104Handler(this CompilerTemplate template, params string[] usings) where T : CompilerTemplate, new() - //{ - // AmbiguityUsings._usingsCache[template.AssemblyBuilder.Compiler.Compilation!] = new HashSet(usings); - // template.AssemblyBuilder.AddSemanticAnalysistor(AmbiguityUsings.UsingsCreator()); - // return template.Link!; - //} -} diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.CompileOption.cs b/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.CompileOption.cs deleted file mode 100644 index d303f578..00000000 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.CompileOption.cs +++ /dev/null @@ -1,103 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Natasha.CSharp.Compiler; -using System; -using System.Diagnostics; - -/// -/// 程序集编译构建器 - 编译选项 -/// -public sealed partial class AssemblyCSharpBuilder -{ - private readonly NatashaCSharpCompilerOptions _compilerOptions; - private CSharpCompilation? _compilation; - public CSharpCompilation? Compilation { get { return _compilation; } } - - public AssemblyCSharpBuilder ConfigCompilerOption(Action action) - { - action(_compilerOptions); - return this; - } - - private bool _isReferenceAssembly; - - private bool _includePrivateMembers; - - /// - /// 输出文件包含私有字段信息 - /// - /// - public AssemblyCSharpBuilder WithPrivateMembers() - { - _includePrivateMembers = true; - return this; - } - /// - /// 输出文件不包含私有字段信息(默认) - /// - /// - public AssemblyCSharpBuilder WithoutPrivateMembers() - { - _includePrivateMembers = false; - return this; - } - - /// - /// 是否以引用程序集方式输出 - /// - /// - public AssemblyCSharpBuilder OutputAsRefAssembly() - { - _isReferenceAssembly = true; - _includePrivateMembers = false; - return this; - } - /// - /// 是否以完全程序集方式输出(默认) - /// - /// - public AssemblyCSharpBuilder OutputAsFullAssembly() - { - _isReferenceAssembly = false; - return this; - } - - private readonly DebugConfiguration _debugConfiguration = new(); - private bool _withDebugInfo; - private OptimizationLevel _codeOptimizationLevel; - - /// - /// 编译时使用 Debug 模式 - /// - /// - public AssemblyCSharpBuilder WithDebugCompile(Action? action = null) - { - action?.Invoke(_debugConfiguration); - _codeOptimizationLevel = OptimizationLevel.Debug; - return this; - } - /// - /// 编译时使用 Release 模式优化(默认) - /// - /// - public AssemblyCSharpBuilder WithReleaseCompile() - { - _withDebugInfo = false; - _codeOptimizationLevel = OptimizationLevel.Release; - return this; - } - /// - /// 编译时使用携带有 DebugInfo 的 Release 模式优化(默认) - /// - /// - public AssemblyCSharpBuilder WithFullReleaseCompile() - { - _withDebugInfo = true; - _codeOptimizationLevel = OptimizationLevel.Release; - return this; - } - -} - - - diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Domain.cs b/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Domain.cs deleted file mode 100644 index 92770344..00000000 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Domain.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.Runtime.Loader; - -/// -/// 程序集编译构建器 - 域 -/// -public sealed partial class AssemblyCSharpBuilder -{ - private NatashaReferenceDomain? _domain; - private DomainConfiguration _domainConfiguration; - - /// - /// 编译单元所在域. - /// - /// - /// - /// - /// - /// //程序集依赖的加载行为将和当前域同步 - /// domain.SetAssemblyLoadBehavior(); - /// //编译单元支持的方法: - /// WithHighVersionDependency - /// WithLowVersionDependency - /// WithDefaultVersionDependency - /// WithCustomVersionDependency - /// - /// - /// - /// - public NatashaReferenceDomain Domain - { - get - { - if (_domain == null) - { - - if (AssemblyLoadContext.CurrentContextualReflectionContext != default) - { - _domain = (NatashaReferenceDomain)(AssemblyLoadContext.CurrentContextualReflectionContext); - if (_domain.AssemblyLoadBehavior != _domainConfiguration._dependencyLoadBehavior) - { - _domain.SetAssemblyLoadBehavior(_domainConfiguration._dependencyLoadBehavior); - } - } - else - { - _domain = NatashaReferenceDomain.DefaultDomain; - } - - } - - return _domain; - } - set - { - if (value == default) - { - value = NatashaReferenceDomain.DefaultDomain; - } - else - { - value.SetAssemblyLoadBehavior(_domainConfiguration._dependencyLoadBehavior); - } - _domain = value; - } - } - - public AssemblyCSharpBuilder ConfigDomain(Action action) - { - action(_domainConfiguration); - if (Domain.Name != "Default") - { - Domain.SetAssemblyLoadBehavior(_domainConfiguration._dependencyLoadBehavior); - } - return this; - } -} - diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Share.cs b/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Share.cs deleted file mode 100644 index f14a5901..00000000 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Share.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; - -public sealed partial class AssemblyCSharpBuilder -{ - internal static bool HasInitialized; - /// - /// 清空编译信息, 下次编译重组 Compilation . - /// - /// - public AssemblyCSharpBuilder ClearCompilationCache() - { - _compilation = null; - return this; - } - - /// - /// 清空所有记录,包括编译信息和脚本记录,以及程序集名称. - /// - /// - public AssemblyCSharpBuilder Clear() - { - _compilation = null; - SyntaxTrees.Clear(); - AssemblyName = string.Empty; - return this; - } - - - /// - /// 自动使用 GUID 作为程序集名称. - /// - /// - public AssemblyCSharpBuilder WithRandomAssenblyName() - { - AssemblyName = Guid.NewGuid().ToString("N"); - return this; - } - - -} - diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/GlobalSupperessCache.cs b/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/GlobalSupperessCache.cs deleted file mode 100644 index 1fab6bbd..00000000 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/GlobalSupperessCache.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Microsoft.CodeAnalysis; -using System.Collections.Concurrent; - -namespace Natasha.CSharp.Component.Compiler -{ - internal static class GlobalSupperessCache - { - internal static readonly ConcurrentDictionary _globalSuppressDiagnostics; - static GlobalSupperessCache() - { - _globalSuppressDiagnostics = new(); - AddGlobalSupperess("CA1050"); - AddGlobalSupperess("CA1822"); - AddGlobalSupperess("CS1701"); - AddGlobalSupperess("CS1702"); - AddGlobalSupperess("CS1705"); - AddGlobalSupperess("CS2008"); - AddGlobalSupperess("CS162"); - AddGlobalSupperess("CS0219"); - AddGlobalSupperess("CS0414"); - AddGlobalSupperess("CS0616"); - AddGlobalSupperess("CS0649"); - AddGlobalSupperess("CS0693"); - AddGlobalSupperess("CS1591"); - AddGlobalSupperess("CS1998"); - //AddGlobalSupperess("RS1014"); - //AddGlobalSupperess("CA1822"); - //AddGlobalSupperess("CS8604"); - // CS8019 - // CS0162 - Unreachable code detected. - // CS0219 - The variable 'V' is assigned but its value is never used. - // CS0414 - The private field 'F' is assigned but its value is never used. - // CS0616 - Member is obsolete. - // CS0649 - Field 'F' is never assigned to, and will always have its default value. - // CS0693 - Type parameter 'type parameter' has the same name as the type parameter from outer type 'T' - // CS1591 - Missing XML comment for publicly visible type or member 'Type_or_Member' - // CS1998 - This async method lacks 'await' operators and will run synchronously - - } - public static void AddGlobalSupperess(string errorcode) - { - _globalSuppressDiagnostics[errorcode] = ReportDiagnostic.Suppress; - } - } -} diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Domain/NatashaReferenceDomain.cs b/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Domain/NatashaReferenceDomain.cs deleted file mode 100644 index 5729015e..00000000 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Domain/NatashaReferenceDomain.cs +++ /dev/null @@ -1,90 +0,0 @@ -using Microsoft.CodeAnalysis; -using Natasha.CSharp.Compiler.Public.Component.Metadata; -using Natasha.CSharp.Component; -using Natasha.CSharp.Using; -using System.Collections.Generic; -using System.Reflection; - -public sealed class NatashaReferenceDomain : NatashaDomain -{ - public static new readonly NatashaReferenceDomain DefaultDomain; - static NatashaReferenceDomain() - { - - DefaultDomain = new NatashaReferenceDomain(); - DomainManagement.Add("Default", DefaultDomain); - - } - - - public IEnumerable GetReferences(ReferenceConfiguration configuration) - { - if (Name == DefaultDomain.Name) - { - return References.GetReferences(); - } - else - { - return References.CombineWithDefaultReferences(DefaultDomain.References, configuration._compileReferenceBehavior, configuration._referenceSameNamePickFunc); - } - } - - /// - /// 引用 记录 - /// - public readonly NatashaReferenceCache References; - /// - /// Using 记录 - /// - public readonly NatashaUsingCache UsingRecorder; - private NatashaReferenceDomain() : base() - { - References = new(); - UsingRecorder = new(); - LoadAssemblyReferencsWithPath += NatashaReferenceDomain_LoadAssemblyReferencsWithPath; - LoadAssemblyReferenceWithStream += NatashaReferenceDomain_LoadAssemblyReferenceWithStream; - } - - - public NatashaReferenceDomain(string key) : base(key) - { - References = new(); - UsingRecorder = new(); - LoadAssemblyReferencsWithPath += NatashaReferenceDomain_LoadAssemblyReferencsWithPath; - LoadAssemblyReferenceWithStream += NatashaReferenceDomain_LoadAssemblyReferenceWithStream; - } - - - private void NatashaReferenceDomain_LoadAssemblyReferenceWithStream(Assembly assembly, System.IO.Stream stream) - { - References.AddReference(assembly.GetName(), MetadataHelper.CreateMetadataReference(stream), AssemblyCompareInfomation.None); - UsingRecorder.Using(assembly); - } - - - public void AddReferenceAndUsing(AssemblyName name, MetadataReference metadataReference, HashSet usings, AssemblyCompareInfomation compareInfomation = AssemblyCompareInfomation.None) - { - References.AddReference(name, metadataReference, compareInfomation); - UsingRecorder.Using(usings); - } - - - private void NatashaReferenceDomain_LoadAssemblyReferencsWithPath(Assembly assembly, string path) - { - References.AddReference(assembly.GetName(), MetadataHelper.CreateMetadataReference(path), AssemblyCompareInfomation.None); - UsingRecorder.Using(assembly); - } - - - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - if (disposing) - { - LoadAssemblyReferencsWithPath -= NatashaReferenceDomain_LoadAssemblyReferencsWithPath; - LoadAssemblyReferenceWithStream -= NatashaReferenceDomain_LoadAssemblyReferenceWithStream; - //References.Clear(); - } - } - -} \ No newline at end of file diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Using/NatashaUsingCache.cs b/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Using/NatashaUsingCache.cs deleted file mode 100644 index b6f76b87..00000000 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Using/NatashaUsingCache.cs +++ /dev/null @@ -1,204 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Reflection; -using System.Text; - -namespace Natasha.CSharp.Using -{ - /// - /// 引用模板 - /// - public sealed class NatashaUsingCache : IEnumerable - { - private bool _changed; - public readonly HashSet _usings; - //internal readonly HashSet _usingTypes; - //private static readonly Regex _using_regex; - - //static NatashaUsingCache() - //{ - // _using_regex = new Regex("[a-zA-Z.]+") - //} - public NatashaUsingCache() - { - - _usings = []; - - } - - public int Count { get { return _usings.Count; } } - - - - public bool HasUsing(string @using) - { - lock (_usings) - { - return _usings.Contains(@using); - } - } - - - - public NatashaUsingCache Using(string? @using) - { - - if (!string.IsNullOrEmpty(@using) && @using!.IndexOf('<') == -1) - { - lock (_usings) - { - if (_usings.Add(@using)) - { - _changed = true; - } - } - } - return this; - - } - - public NatashaUsingCache Using(IEnumerable @using) - { - lock (_usings) - { - _usings.UnionWith(@using); - _changed = true; - } - return this; - } - - - - - /// - /// 从程序集里获取引用 - /// - /// 程序集 - /// - public NatashaUsingCache Using(Assembly assembly) - { - - if (assembly != default) - { - try - { - Using(assembly.GetExportedTypes()); - } - catch - { - - } - - } - return this; - - } - - - - /// - /// 设置命名空间 - /// - /// 命名空间 - /// - public NatashaUsingCache Using(params Assembly[] namespaces) - { - - for (int i = 0; i < namespaces.Length; i++) - { - - Using(namespaces[i]); - - } - return this; - - } - public NatashaUsingCache Using(IEnumerable namespaces) - { - - foreach (var item in namespaces) - { - Using(item); - } - return this; - - } - - public NatashaUsingCache Remove(string @using) - { - lock (_usings) - { - if (_usings.Remove(@using)) - { - _changed = true; - } - } - return this; - } - - public NatashaUsingCache Remove(IEnumerable @usings) - { - lock (_usings) - { - _usings.ExceptWith(@usings); - _changed = true; - } - return this; - } - - - - public NatashaUsingCache Using(IEnumerable namespaces) - { - foreach (var item in namespaces) - { - - Using(item); - - } - return this; - } - - - - - public NatashaUsingCache Using(Type type) - { - return Using(type.Namespace); - } - - private string _usingScript = string.Empty; - public override string ToString() - { - lock (_usings) - { - if (_changed) - { - StringBuilder usings = new(); - foreach (var item in _usings) - { - usings.AppendLine($"using {item};"); - } - _usingScript = usings.ToString(); - _changed = false; - } - } - return _usingScript; - } - - public IEnumerator GetEnumerator() - { - return _usings.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - foreach (var item in _usings) - { - yield return item; - } - } - } - -} \ No newline at end of file diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/Inner/CSharpCompilationExtension.cs b/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/Inner/CSharpCompilationExtension.cs deleted file mode 100644 index f6be7567..00000000 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/Inner/CSharpCompilationExtension.cs +++ /dev/null @@ -1,123 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Natasha.CSharp.Extension.Inner -{ - - internal static class CSharpCompilationExtension - { - internal static NatashaCompilationLog GetNatashaLog(this CSharpCompilation compilation) - { - NatashaCompilationLog natashaCompilation = new(); - natashaCompilation.AddCompilationInfo("AssemblyName", compilation.AssemblyName ?? string.Empty); - natashaCompilation.AddCompilationInfo("Language", compilation.Language); - natashaCompilation.AddCompilationInfo("LanguageVersion", compilation.LanguageVersion.ToString()); - natashaCompilation.AddCompilationInfo("SyntaxTreeCount", compilation.SyntaxTrees.Length.ToString()); - natashaCompilation.AddCompilationInfo("ReferencesCount", compilation.References.Count().ToString()); - var errors = compilation.GetDiagnostics(); - if (errors.Length > 0) - { - Dictionary> syntaxCache = new(); - foreach (var item in compilation.GetDiagnostics()) - { - if (item.Location.SourceTree != null) - { - var tree = item.Location.SourceTree; - if (!syntaxCache.ContainsKey(tree)) - { - syntaxCache[tree] = new List(); - } - syntaxCache[tree].Add(item); - } - } - natashaCompilation.HasError = true; - foreach (var item in syntaxCache) - { - var codeText = item.Key.ToString(); - StringBuilder errorMessage = new(); - foreach (var error in item.Value) - { - var span = error.Location.GetLineSpan(); - errorMessage.AppendLine($"第{span.StartLinePosition.Line + 1}行,第{span.StartLinePosition.Character}个字符: 内容【{GetErrorMessage(codeText, error.Location.GetLineSpan())}】 {error.GetMessage()}"); - } - natashaCompilation.AddMessage(item.Value.Count, AddLineNumber(codeText), errorMessage.ToString()); - } - } - else - { - natashaCompilation.HasError = false; - foreach (var item in compilation.SyntaxTrees) - { - natashaCompilation.AddMessage(0, AddLineNumber(item.ToString()), item.GetFirstOopName()); - } - } - return natashaCompilation; - } - private static string GetErrorMessage(string content, FileLinePositionSpan linePositionSpan) - { - - var start = linePositionSpan.StartLinePosition; - var end = linePositionSpan.EndLinePosition; - - - var arrayLines = content.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); - var currentErrorLine = arrayLines[start.Line]; - - - if (start.Line == end.Line) - { - - if (start.Character == end.Character) - { - - return currentErrorLine.Trim(); - - } - else - { - - return currentErrorLine[start.Character..end.Character].Trim(); - - } - - } - else - { - - StringBuilder builder = new(); - builder.AppendLine(currentErrorLine[start.Character..]); - for (int i = start.Line; i < end.Line - 1; i += 1) - { - - builder.AppendLine(arrayLines[i]); - - } - currentErrorLine = arrayLines[end.Line]; - builder.AppendLine(currentErrorLine[..end.Character]); - return builder.ToString(); - - } - - } - private static string AddLineNumber(string code) - { - - StringBuilder builder = new(); - var arrayLines = code.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); - for (int i = 0; i < arrayLines.Length; i += 1) - { - - builder.AppendLine($"{i + 1}\t{arrayLines[i]}"); - - } - return builder.ToString(); - - } - } -} - - diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaAssemblyBuilderExtension.cs b/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaAssemblyBuilderExtension.cs deleted file mode 100644 index fd05b8c0..00000000 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaAssemblyBuilderExtension.cs +++ /dev/null @@ -1,125 +0,0 @@ -using Natasha.CSharp.Compiler.Public.Component.Metadata; -using System.Reflection; -using System; - -public static class NatashaAssemblyBuilderExtension -{ - public static AssemblyCSharpBuilder SetOutputFolder(this AssemblyCSharpBuilder builder, string folder) - { - builder.OutputFolder = folder; - return builder; - } - public static AssemblyCSharpBuilder SetDllFilePath(this AssemblyCSharpBuilder builder, string dllFilePath) - { - builder.DllFilePath = dllFilePath; - return builder; - } - public static AssemblyCSharpBuilder SetPdbFilePath(this AssemblyCSharpBuilder builder, string pdbFilePath) - { - builder.PdbFilePath = pdbFilePath; - return builder; - } - public static AssemblyCSharpBuilder SetCommentFilePath(this AssemblyCSharpBuilder builder, string commentFilePath) - { - builder.CommentFilePath = commentFilePath; - return builder; - } - /// - /// 编译单元使用随机域 - /// - /// 编译单元 - /// - public static AssemblyCSharpBuilder UseRandomDomain(this AssemblyCSharpBuilder builder) - { - builder.Domain = DomainManagement.Random(); - return builder; - } - - /// - /// 编译单元使用新的随机域 - /// - /// 编译单元 - /// 域名字 - /// - public static AssemblyCSharpBuilder UseNewDomain(this AssemblyCSharpBuilder builder, string domainName) - { - builder.Domain = DomainManagement.Create(domainName); - return builder; - } - - /// - /// 编译单元使用新的随机域 - /// - /// 编译单元 - /// - public static AssemblyCSharpBuilder UseDefaultDomain(this AssemblyCSharpBuilder builder) - { - builder.Domain = NatashaReferenceDomain.DefaultDomain; - return builder; - } - - /// - /// 增加引用 和 using, 会自动查重。 - /// - /// Natasha 编译单元 - /// 要添加引用的类型 - /// 加载行为 - public static AssemblyCSharpBuilder AddReferenceAndUsingCode(this AssemblyCSharpBuilder builder, Type type, AssemblyCompareInfomation loadReferenceBehavior = AssemblyCompareInfomation.None) - { - return AddReferenceAndUsingCode(builder, type.Assembly, loadReferenceBehavior); - } - - /// - /// 增加引用 和 using - /// - /// Natasha 编译单元 - /// 程序集 - /// 加载行为 - public static AssemblyCSharpBuilder AddReferenceAndUsingCode(this AssemblyCSharpBuilder builder, Assembly assembly, AssemblyCompareInfomation loadReferenceBehavior = AssemblyCompareInfomation.None) - { - var result = MetadataHelper.GetMetadataAndNamespaceFromMemory(assembly, null); - if (result.HasValue) - { - builder.Domain.AddReferenceAndUsing(result.Value.asmName, result.Value.metadata, result.Value.namespaces, loadReferenceBehavior); - - var assemblyNames = assembly.GetReferencedAssemblies(); - if (assemblyNames != null && assemblyNames.Length > 0) - { - foreach (var asmName in assemblyNames) - { - if (asmName != null && !builder.Domain.References.HasReference(asmName)) - { - var depAssembly = Assembly.Load(asmName); - if (depAssembly != null) - { - result = MetadataHelper.GetMetadataAndNamespaceFromMemory(depAssembly, null); - if (result.HasValue) - { - builder.Domain.AddReferenceAndUsing(asmName, result.Value.metadata, result.Value.namespaces, loadReferenceBehavior); - } - } - } - } - - } - } - return builder; - } - - /// - /// 增加引用 和 using - /// - /// Natasha 编译单元 - /// 文件路径 - /// 加载行为 - public static AssemblyCSharpBuilder AddReferenceAndUsingCode(this AssemblyCSharpBuilder builder, string path, AssemblyCompareInfomation loadReferenceBehavior = AssemblyCompareInfomation.None) - { - var result = MetadataHelper.GetMetadataAndNamespaceFromFile(path, null); - if (result.HasValue) - { - builder.Domain.AddReferenceAndUsing(result.Value.asmName, result.Value.metadata, result.Value.namespaces, loadReferenceBehavior); - } - return builder; - } -} - diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaDomainExtension.cs b/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaDomainExtension.cs deleted file mode 100644 index 3705401b..00000000 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaDomainExtension.cs +++ /dev/null @@ -1,16 +0,0 @@ -using static System.Runtime.Loader.AssemblyLoadContext; - -public static class NatashaDomainExtension -{ - - /// - /// 创建一个以该字符串命名的域并锁定 - /// - /// - /// - public static ContextualReflectionScope NatashaDomainScope(this string domain) - { - return DomainManagement.Create(domain).EnterContextualReflection(); - } - -} \ No newline at end of file diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Natasha.CSharp.Compiler.csproj b/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Natasha.CSharp.Compiler.csproj deleted file mode 100644 index ce9420d2..00000000 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Natasha.CSharp.Compiler.csproj +++ /dev/null @@ -1,41 +0,0 @@ - - - - netcoreapp3.1;net5.0;net6.0;net7.0;net8.0; - Natasha 的 C# 版编译器 - DotNetCore.Natasha.CSharp.Compiler - 升级到最新版. - Roslyn;IL;Script;Dynamic;Natasha;NMS;Compiler; - true - 8.0.0.0 - 8.0.0.0 - 8.0.0.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Natasha.CSharp/Core/Natasha.Domain/Natasha.Domain.csproj b/src/Natasha.CSharp/Core/Natasha.Domain/Natasha.Domain.csproj deleted file mode 100644 index 95d4b801..00000000 --- a/src/Natasha.CSharp/Core/Natasha.Domain/Natasha.Domain.csproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - netcoreapp3.1;net5.0;net6.0;net7.0;net8.0; - Natasha 编译域的实现 - DotNetCore.Natasha.Domain - 升级 - Roslyn;IL;Scripte;Dynamic;Natasha;Domain; - true - 5.2.0.1 - 5.2.0.1 - 5.2.0.1 - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Extension/AssemblyExtension.cs b/src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Extension/AssemblyExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Extension/AssemblyExtension.cs rename to src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Extension/AssemblyExtension.cs diff --git a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Extension/AssenblyCSharpBuilderExtension.cs b/src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Extension/AssenblyCSharpBuilderExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Extension/AssenblyCSharpBuilderExtension.cs rename to src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Extension/AssenblyCSharpBuilderExtension.cs diff --git a/src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Natasha.CSharp.Codecov.csproj b/src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Natasha.CSharp.Codecov.csproj new file mode 100644 index 00000000..33ba4932 --- /dev/null +++ b/src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Natasha.CSharp.Codecov.csproj @@ -0,0 +1,20 @@ + + + + netstandard2.0; + enable + enable + true + Natasha 的方法使用率统计扩展. + DotNetCore.Natasha.CSharp.Codecov + 升级到最新版. + Natasha;Compiler;Extension;Codecov; + 8.0.0.0 + 8.0.0.0 + 8.0.0.0 + + + + + + diff --git a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Targets/Project.Usings.targets b/src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Targets/Project.Usings.targets similarity index 100% rename from src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Targets/Project.Usings.targets rename to src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Targets/Project.Usings.targets diff --git a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Utils/CodecovMonitor.cs b/src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Utils/CodecovMonitor.cs similarity index 96% rename from src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Utils/CodecovMonitor.cs rename to src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Utils/CodecovMonitor.cs index 5d32b848..a2a0478c 100644 --- a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Utils/CodecovMonitor.cs +++ b/src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Utils/CodecovMonitor.cs @@ -33,7 +33,7 @@ public static unsafe void AnalaysisAssemblyToCache(Assembly assembly) var fieldInfo = compilerGeneratedType.GetField("MVID", BindingFlags.NonPublic | BindingFlags.Static) ?? throw new MissingMemberException(compilerGeneratedType.FullName, "MVID"); var mvid = (Guid)fieldInfo.GetValue(null)!; - if (assembly.TryGetRawMetadata(out var blob, out var length)) + if (NatashaLoadContext.Creator.TryGetRawMetadata(assembly,out var blob, out var length)) { var metaReader = new MetadataReader(blob, length); var methodTotal = metaReader.MethodDefinitions.Count; diff --git a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Utils/CodecovRecorder.cs b/src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Utils/CodecovRecorder.cs similarity index 100% rename from src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Utils/CodecovRecorder.cs rename to src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Utils/CodecovRecorder.cs diff --git a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Utils/MethodDefinedFilter.cs b/src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Utils/MethodDefinedFilter.cs similarity index 100% rename from src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Codecov/Utils/MethodDefinedFilter.cs rename to src/Natasha.CSharp/Extension/Natasha.CSharp.Codecov/Utils/MethodDefinedFilter.cs diff --git a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/AmbiguityUsings.cs b/src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/AmbiguityUsings.cs similarity index 56% rename from src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/AmbiguityUsings.cs rename to src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/AmbiguityUsings.cs index 88f94ec6..eb6fbaaf 100644 --- a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/AmbiguityUsings.cs +++ b/src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/AmbiguityUsings.cs @@ -1,8 +1,7 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Natasha.CSharp.Builder; -using Natasha.CSharp.Using; +using Natasha.CSharp.Compiler.Component; using System; using System.Collections.Generic; using System.Linq; @@ -11,13 +10,22 @@ namespace Natasha.CSharp.Extension.Ambiguity { internal static class AmbiguityUsings { - //internal static readonly ConcurrentDictionary> _usingsCache; - //static AmbiguityUsings() - //{ - // _usingsCache = new ConcurrentDictionary>(); - //} + internal static readonly Func SemanticAction; + static AmbiguityUsings() + { + SemanticAction = (builder, compilation, ignoreAccessibility) => + { + builder.CheckNullLoadContext(); + var trees = compilation.SyntaxTrees; + foreach (var tree in trees) + { + compilation = HandlerCS0104(tree, compilation, builder.LoadContext!.UsingRecorder, ignoreAccessibility); + } + return compilation; - private static CSharpCompilation HandlerCS0104(SyntaxTree syntaxTree, CSharpCompilation compilation, NatashaUsingCache usings, bool ignoreAccessibility) + }; + } + private static CSharpCompilation HandlerCS0104(SyntaxTree syntaxTree, CSharpCompilation compilation, NatashaUsingCache usings, bool ignoreAccessibility) { var semantiModel = compilation.GetSemanticModel(syntaxTree, ignoreAccessibility); var errors = semantiModel.GetDiagnostics(); @@ -39,7 +47,7 @@ private static CSharpCompilation HandlerCS0104(SyntaxTree syntaxTree, CSharpComp { var node = (from usingDeclaration in root.Usings - where usingDeclaration.Name.ToString() == spaceName + where usingDeclaration.Name != null && usingDeclaration.Name.ToString() == spaceName select usingDeclaration).FirstOrDefault(); if (node != null) { @@ -56,7 +64,7 @@ where usingDeclaration.Name.ToString() == spaceName var spaceName = info.CandidateSymbols[info.CandidateSymbols.Length - 1]!.OriginalDefinition.ContainingNamespace.ToString(); var node = (from usingDeclaration in root.Usings - where usingDeclaration.Name.ToString() == spaceName + where usingDeclaration.Name != null && usingDeclaration.Name.ToString() == spaceName select usingDeclaration).FirstOrDefault(); if (node != null) { @@ -74,72 +82,5 @@ where usingDeclaration.Name.ToString() == spaceName } return compilation; } - - - internal static Func OopBuilderCreator(OopBuilder oopBuilder) where T : OopBuilder, new() - { - return (builder, compilation, ignoreAccessibility) => - { - - var trees = compilation.SyntaxTrees; - foreach (var tree in trees) - { - compilation = HandlerCS0104(tree, compilation, oopBuilder.UsingRecorder, ignoreAccessibility); - } - return compilation; - - }; - } - - - - - - internal static Func MethodBuilderCreator(MethodBuilder methodBuilder) where T : MethodBuilder, new() - { - return (builder,compilation, ignoreAccessibility) => - { - - var trees = compilation.SyntaxTrees; - foreach (var tree in trees) - { - - compilation = HandlerCS0104(tree, compilation, methodBuilder.OopHandler.UsingRecorder, ignoreAccessibility); - - } - return compilation; - - }; - } - internal static Func NDelegateCreator(NDelegate nDelegate) - { - return (builder, compilation, ignoreAccessibility) => - { - - var trees = compilation.SyntaxTrees; - foreach (var tree in trees) - { - compilation = HandlerCS0104(tree, compilation, nDelegate.MethodHandler.OopHandler.UsingRecorder, ignoreAccessibility); - } - return compilation; - - }; - } - //internal static Func UsingsCreator() - //{ - // return compilation => - // { - - // var trees = compilation.SyntaxTrees; - // foreach (var tree in trees) - // { - // compilation = HandlerCS0104(tree, compilation, ); - - // } - // _usingsCache!.Remove(compilation); - // return compilation; - - // }; - //} } } diff --git a/src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/Extension/AssenblyCSharpBuilderExtension.cs b/src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/Extension/AssenblyCSharpBuilderExtension.cs new file mode 100644 index 00000000..57465c69 --- /dev/null +++ b/src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/Extension/AssenblyCSharpBuilderExtension.cs @@ -0,0 +1,11 @@ +using Natasha.CSharp.Extension.Ambiguity; + +public static class AssenblyCSharpBuilder +{ + public static AssemblyCSharpBuilder WithCodecov(this AssemblyCSharpBuilder builder) + { + builder.AddSemanticAnalysistor(AmbiguityUsings.SemanticAction); + return builder; + } +} + diff --git a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/Natasha.CSharp.Extension.Ambiguity.csproj b/src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/Natasha.CSharp.Extension.Ambiguity.csproj similarity index 57% rename from src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/Natasha.CSharp.Extension.Ambiguity.csproj rename to src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/Natasha.CSharp.Extension.Ambiguity.csproj index f43bda18..f49c58d1 100644 --- a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/Natasha.CSharp.Extension.Ambiguity.csproj +++ b/src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/Natasha.CSharp.Extension.Ambiguity.csproj @@ -1,18 +1,18 @@ - netcoreapp3.1;net6.0;net8.0; + netstandard2.0; CS0104 问题处理扩展 DotNetCore.Natasha.Extension.Ambiguity 升级到最新版. Roslyn;IL;Script;Dynamic;Natasha;NMS;CS0104; - 1.0.0.4 - 1.0.0.4 - 1.0.0.4 + 8.0.0.0 + 8.0.0.0 + 8.0.0.0 - + diff --git a/src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/RegexHelper.cs b/src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/RegexHelper.cs similarity index 100% rename from src/Natasha.CSharp/Core/Extension/Natasha.CSharp.Extension.Ambiguity/RegexHelper.cs rename to src/Natasha.CSharp/Extension/Natasha.CSharp.Extension.Ambiguity/RegexHelper.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Compile.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Compile.cs deleted file mode 100644 index 37789961..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Compile.cs +++ /dev/null @@ -1,203 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Emit; -using Natasha.CSharp.Component.Exception; -using Natasha.CSharp.Extension.Inner; -using System.Diagnostics; -using System.IO; -using System.Reflection; -using System; -using System.Collections.Concurrent; -using Microsoft.CodeAnalysis.CSharp; - -using System.Collections.Immutable; - -using Natasha.CSharp.Component; -/// -/// 程序集编译构建器 - 编译选项 -/// -public sealed partial class AssemblyCSharpBuilder -{ - - /// - /// 流编译成功之后触发的事件 - /// - public event Action? CompileSucceedEvent; - - - /// - /// 流编译失败之后触发的事件 - /// - public event Action>? CompileFailedEvent; - - private ConcurrentQueue>? _emitOptionHandle; - /// - /// 处理默认生成的 emitOption 并返回一个新的 - /// - /// - /// - public AssemblyCSharpBuilder ConfigEmitOptions(Func handleAndReturnNewEmitOption) - { - _emitOptionHandle ??= new ConcurrentQueue>(); - _emitOptionHandle.Enqueue(handleAndReturnNewEmitOption); - return this; - } - - private bool _notLoadIntoDomain; - /// - /// 仅仅生成程序集,而不加载到域。 - /// - /// - public AssemblyCSharpBuilder WithoutInjectToDomain() - { - _notLoadIntoDomain = true; - return this; - } - /// - /// 既生成程序集又加载到域。 - /// - /// - public AssemblyCSharpBuilder WithInjectToDomain() - { - _notLoadIntoDomain = false; - return this; - } - - /// - /// 将 SyntaxTrees 中的语法树编译到程序集.如果不成功会抛出 NatashaException. - /// - /// - /// - /// - /// - /// //Core3.0以上版本 - /// //程序集的域加载行为决定了编译后的程序集随着依赖加载到域中的处理结果. - /// //编译单元支持的依赖加载方法: - /// WithHighVersionDependency - /// WithLowVersionDependency - /// WithDefaultVersionDependency - /// WithCustomVersionDependency - /// - /// //编译单元的引用加载行为, 遇到同名不同版本的引用该如何处理. - /// //首先启用合并引用,此方法将允许主域引用和当前域引用进行整合 - /// builder.WithCombineReferences(configAction); - /// //其参数支持同名引用的加载逻辑,包括 - /// config.UseHighVersionReferences - /// config.UseLowVersionReferences - /// config.UseDefaultReferences - /// config.UseCustomReferences - /// //手动设置同名过滤器 - /// config.ConfigSameNameReferencesFilter(func); - /// //手动设置全部引用过滤器 - /// builder.SetReferencesFilter - /// - /// - /// - /// - public Assembly GetAssembly() - { - _compilation ??= GetAvailableCompilation(); - -#if DEBUG - Stopwatch stopwatch = new(); - stopwatch.Start(); -#endif - Stream dllStream; - Stream? pdbStream = null; - Stream? xmlStream = null; - if (DllFilePath != string.Empty) - { - dllStream = File.Create(DllFilePath); - } - else - { - dllStream = new MemoryStream(); - } - - if (CommentFilePath != string.Empty) - { - xmlStream = File.Create(CommentFilePath); - } - - var debugInfoFormat = _debugConfiguration._informationFormat; - if (_compilation!.Options.OptimizationLevel == OptimizationLevel.Debug) - { - - if (debugInfoFormat != DebugInformationFormat.Embedded) - { - if (string.IsNullOrEmpty(PdbFilePath)) - { - var tempPdbOutputFolder = Path.Combine(GlobalOutputFolder, "Default"); - PdbFilePath = Path.Combine(tempPdbOutputFolder, $"{AssemblyName}.pdb"); - if (!Directory.Exists(tempPdbOutputFolder)) - { - Directory.CreateDirectory(tempPdbOutputFolder); - } - } - pdbStream = File.Create(PdbFilePath); - } - else - { - PdbFilePath = null; - } - } - else - { - if (!string.IsNullOrEmpty(PdbFilePath)) - { - PdbFilePath = null; - } - debugInfoFormat = 0; - } - var emitOption = new EmitOptions( - //runtimeMetadataVersion: Assembly.GetExecutingAssembly().ImageRuntimeVersion, - //instrumentationKinds: [InstrumentationKind.TestCoverage], - includePrivateMembers: _includePrivateMembers, - metadataOnly: _isReferenceAssembly, - pdbFilePath: PdbFilePath, - debugInformationFormat: debugInfoFormat - ); - - if (_emitOptionHandle != null) - { - while (!_emitOptionHandle.IsEmpty) - { - while (_emitOptionHandle.TryDequeue(out var func)) - { - emitOption = func(emitOption); - } - } - } - - var compileResult = _compilation.Emit( - dllStream, - pdbStream: pdbStream, - xmlDocumentationStream: xmlStream, - options: emitOption - ); - LogCompilationEvent?.Invoke(_compilation.GetNatashaLog()); - Assembly? assembly = null; - - - - dllStream.Dispose(); - pdbStream?.Dispose(); - xmlStream?.Dispose(); - if (compileResult.Success) - { - assembly = Assembly.LoadFrom(DllFilePath); - DefaultUsing.AddUsing(assembly); - NatashaReferenceCache.AddReference(DllFilePath); - CompileSucceedEvent?.Invoke(_compilation, assembly!); - } - if (!compileResult.Success) - { - CompileFailedEvent?.Invoke(_compilation, compileResult.Diagnostics); - throw NatashaExceptionAnalyzer.GetCompileException(_compilation, compileResult.Diagnostics); - } - -#if DEBUG - stopwatch.StopAndShowCategoreInfo("[ Emit ]", "编译时长", 2); -#endif - return assembly!; - } -} diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Log.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Log.cs deleted file mode 100644 index 6baf6501..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Log.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -public sealed partial class AssemblyCSharpBuilder -{ - - public event Action? LogCompilationEvent; - public AssemblyCSharpBuilder SetLogEvent(Action logAction) - { - LogCompilationEvent = logAction; - return this; - } - -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Ouput.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Ouput.cs deleted file mode 100644 index ed749ade..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Ouput.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.IO; - -/// -/// 程序集编译构建器-输出 -/// -public sealed partial class AssemblyCSharpBuilder -{ - - #region 输出设置相关 - public string AssemblyName; - public string DllFilePath; - public string? PdbFilePath; - public string CommentFilePath; - public string OutputFolder; - /// - /// 默认的输出文件夹 - /// - public static readonly string GlobalOutputFolder; - static AssemblyCSharpBuilder() - { - - GlobalOutputFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory!, "DynamicLibraryFolders"); - if (!Directory.Exists(GlobalOutputFolder)) - { - Directory.CreateDirectory(GlobalOutputFolder); - } - - } - - public AssemblyCSharpBuilder SetAssemblyName(string asmName) - { - AssemblyName = asmName; - return this; - } - - /// - /// 设置程序编译后,dll/pdb/xml 文件的路径。使用此功能,程序编译后结果会输出到文件中。 - /// - /// - /// - /// - /// - public AssemblyCSharpBuilder WithFileOutput(string dllFilePath, string? pdbFilePath = null, string? commentFilePath = null) - { - DllFilePath = dllFilePath; - PdbFilePath = pdbFilePath; - if (commentFilePath != null) - { - CommentFilePath = commentFilePath; - } - return this; - } - - // - /// 将编译结果 (dll / pdb / xml) 文件写入此文件夹。 - /// 默认不输出到文件,只输出到内存。 - /// - /// 文件夹路径 - /// - public AssemblyCSharpBuilder WithFileOutput(string? folder = null) - { - if (folder == null) - { - if (OutputFolder == GlobalOutputFolder) - { - OutputFolder = Path.Combine(GlobalOutputFolder, "Default"); - } - } - else - { - OutputFolder = folder; - } - if (!Directory.Exists(OutputFolder)) - { - Directory.CreateDirectory(OutputFolder); - } - DllFilePath = Path.Combine(OutputFolder, $"{AssemblyName}.dll"); - PdbFilePath = Path.Combine(OutputFolder, $"{AssemblyName}.pdb"); - CommentFilePath = Path.Combine(OutputFolder, $"{AssemblyName}.xml"); - return this; - } - #endregion - -} - - - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Semantic.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Semantic.cs deleted file mode 100644 index 53849e7c..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Semantic.cs +++ /dev/null @@ -1,90 +0,0 @@ -using Microsoft.CodeAnalysis.CSharp; -using Natasha.CSharp.Compiler.SemanticAnalaysis; -using System; -using System.Collections.Generic; - -/// -/// 程序集编译构建器 - 语义 -/// -public sealed partial class AssemblyCSharpBuilder -{ - - private readonly List> _semanticAnalysistor; - private bool _semanticCheckIgnoreAccessibility; - - /// - /// 语义检查时,开启访问性检查 - /// - /// - public AssemblyCSharpBuilder WithAnalysisAccessibility() - { - _semanticCheckIgnoreAccessibility = false; - return this; - } - - /// - /// 语义检查时,关闭访问性检查 - /// - /// - public AssemblyCSharpBuilder WithoutAnalysisAccessibility() - { - _semanticCheckIgnoreAccessibility = true; - return this; - } - /// - /// 添加语义处理器 - /// - /// - /// - public AssemblyCSharpBuilder AddSemanticAnalysistor(Func func) - { - _semanticAnalysistor.Add(func); - return this; - } - /// - /// 移除语义处理器 - /// - /// - /// - public AssemblyCSharpBuilder RemoveSemanticAnalysistor(Func func) - { - _semanticAnalysistor.Remove(func); - return this; - } - - public bool EnableSemanticHandler; - /// - /// 开启语义检测, 若预热,则自动开启。 - /// - /// - - public AssemblyCSharpBuilder WithoutSemanticCheck() - { - EnableSemanticHandler = false; - return this; - } - /// - /// 关闭语义检测,默认:若预热则为开启,否则是关闭。 - /// - /// - public AssemblyCSharpBuilder WithSemanticCheck() - { - EnableSemanticHandler = true; - return this; - } - - /// - /// 清除当前编译单元所有的语义处理器 - /// - /// - public AssemblyCSharpBuilder ClearInnerSemanticAnalysistor() - { - _semanticAnalysistor.Remove(UsingAnalysistor._usingSemanticDelegate); - return this; - } - - -} - - - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Share.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Share.cs deleted file mode 100644 index f14a5901..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Share.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; - -public sealed partial class AssemblyCSharpBuilder -{ - internal static bool HasInitialized; - /// - /// 清空编译信息, 下次编译重组 Compilation . - /// - /// - public AssemblyCSharpBuilder ClearCompilationCache() - { - _compilation = null; - return this; - } - - /// - /// 清空所有记录,包括编译信息和脚本记录,以及程序集名称. - /// - /// - public AssemblyCSharpBuilder Clear() - { - _compilation = null; - SyntaxTrees.Clear(); - AssemblyName = string.Empty; - return this; - } - - - /// - /// 自动使用 GUID 作为程序集名称. - /// - /// - public AssemblyCSharpBuilder WithRandomAssenblyName() - { - AssemblyName = Guid.NewGuid().ToString("N"); - return this; - } - - -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Syntax.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Syntax.cs deleted file mode 100644 index e6857378..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.Syntax.cs +++ /dev/null @@ -1,149 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Natasha.CSharp.Component.Exception; -using Natasha.CSharp.Syntax; -using System; -using System.Collections.Generic; - -/// -/// 程序集编译构建器 - 语法树相关 -/// -public sealed partial class AssemblyCSharpBuilder -{ - - public readonly List SyntaxTrees; - private CSharpParseOptions? _options; - private UsingLoadBehavior _parsingBehavior; - /// - /// 配置语法树选项 - /// - /// - /// - public AssemblyCSharpBuilder ConfigSyntaxOptions(CSharpParseOptions cSharpParseOptions) - { - _options = cSharpParseOptions; - return this; - } - /// - /// 配置语法树选项 - /// - /// - /// - public AssemblyCSharpBuilder ConfigSyntaxOptions(Func cSharpParseOptionsAction) - { - _options = cSharpParseOptionsAction(new CSharpParseOptions()); - return this; - } - - /// - /// 设置 using 引用行为,默认为 None (同 WithoutCombineUsingCode). - /// - /// - /// - public AssemblyCSharpBuilder WithCombineUsingCode(UsingLoadBehavior usingLoadBehavior) - { - _parsingBehavior = usingLoadBehavior; - return this; - } - - public AssemblyCSharpBuilder WithoutCombineUsingCode() - { - _parsingBehavior = UsingLoadBehavior.None; - return this; - } - - /// - /// 注入代码并拼接using - /// - /// 脚本代码 - /// using 拼接行为 - /// - public AssemblyCSharpBuilder Add(string script, UsingLoadBehavior usingLoadBehavior) - { - switch (usingLoadBehavior) - { - case UsingLoadBehavior.WithDefault: - case UsingLoadBehavior.WithCurrent: - case UsingLoadBehavior.WithAll: - return AddScript(DefaultUsing.UsingScript + script); - default: - return AddScript(script); - } - } - - /// - /// 注入代码并拼接using,拼接 using 的逻辑与 WithCombineUsingCode 方法设置有关. - /// 在开启预热后,将自动拼接主域与当前域的 using. - /// - /// C#代码 - /// - public AssemblyCSharpBuilder Add(string script) - { - return Add(script, _parsingBehavior); - } - - /// - /// 添加脚本 - /// - /// - private AssemblyCSharpBuilder AddScript(string script) - { - var tree = NatashaCSharpSyntax.ParseTree(script, _options); - var exception = NatashaExceptionAnalyzer.GetSyntaxException(tree); - if (exception != null) - { - throw exception; - } - else - { - lock (SyntaxTrees) - { - SyntaxTrees.Add(tree); - } - } - return this; - } - - /// - /// 快速添加语法树,无检查 - /// - /// - /// - internal AssemblyCSharpBuilder FastAddScriptWithoutCheck(string script) - { - SyntaxTrees.Add(NatashaCSharpSyntax.ParseTree(script, _options)); - return this; - } - - /// - /// 添加语法树 - /// - /// - public AssemblyCSharpBuilder Add(SyntaxTree tree) - { - tree = NatashaCSharpSyntax.FormartTree(tree, _options); - var exception = NatashaExceptionAnalyzer.GetSyntaxException(tree); - if (exception != null) - { - throw exception; - } - else - { - lock (SyntaxTrees) - { - SyntaxTrees.Add(tree); - } - } - return this; - } - - public AssemblyCSharpBuilder ClearScript() - { - SyntaxTrees.Clear(); - return this; - } - -} - - - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/SemanticAnalaysis/AssemblyCSharpBuilder.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/SemanticAnalaysis/AssemblyCSharpBuilder.cs deleted file mode 100644 index f91bddb9..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/SemanticAnalaysis/AssemblyCSharpBuilder.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Natasha.CSharp.Compiler.SemanticAnalaysis; -using System; -using System.Runtime.CompilerServices; - -/// -/// 程序集编译构建器 -/// 默认开启语义过滤 -/// 默认域内引用优先 -/// 默认GUID作为程序集名 -/// -[assembly: InternalsVisibleTo("FrameworkFunctionUT, PublicKey=002400000480000094000000060200000024000052534131000400000100010069acb31dd0d9918441d6ed2b49cd67ae17d15fd6ded4ccd2f99b4a88df8cddacbf72d5897bb54f406b037688d99f482ff1c3088638b95364ef614f01c3f3f2a2a75889aa53286865463fb1803876056c8b98ec57f0b3cf2b1185de63d37041ba08f81ddba0dccf81efcdbdc912032e8d2b0efa21accc96206c386b574b9d9cb8")] -public sealed partial class AssemblyCSharpBuilder -{ - - public AssemblyCSharpBuilder():this(Guid.NewGuid().ToString("N")) - { - - } - public AssemblyCSharpBuilder(string assemblyName) - { - _semanticCheckIgnoreAccessibility = false; - OutputFolder = GlobalOutputFolder; - _parsingBehavior = UsingLoadBehavior.None; - _compilerOptions = new(); - SyntaxTrees = []; - AssemblyName = assemblyName; - DllFilePath = string.Empty; - CommentFilePath = string.Empty; - _semanticAnalysistor = [UsingAnalysistor._usingSemanticDelegate]; - WithFileOutput(); - if (HasInitialized) - { - - this - .WithCombineUsingCode(UsingLoadBehavior.WithAll) - .WithReleaseCompile() - .WithSemanticCheck(); - } - else - { - - this - .WithCombineUsingCode(UsingLoadBehavior.WithCurrent) - .WithReleaseCompile() - .WithoutSemanticCheck(); - } - } - -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/SemanticAnalaysis/UsingAnalysistor.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/SemanticAnalaysis/UsingAnalysistor.cs deleted file mode 100644 index 16473466..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/SemanticAnalaysis/UsingAnalysistor.cs +++ /dev/null @@ -1,100 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using System; -using System.Collections.Generic; -using System.Diagnostics; - -namespace Natasha.CSharp.Compiler.SemanticAnalaysis -{ - internal static class UsingAnalysistor - { - internal static readonly Func _usingSemanticDelegate; - static UsingAnalysistor() - { - - _usingSemanticDelegate = (builder, compilation, ignoreAccessibility) => - { - - var trees = compilation.SyntaxTrees; - foreach (var tree in trees) - { -#if DEBUG - Stopwatch stopwatch = new(); - stopwatch.Start(); -#endif - CompilationUnitSyntax root = tree.GetCompilationUnitRoot(); - - SemanticModel semantiModel = compilation.GetSemanticModel(tree, ignoreAccessibility); -#if DEBUG - stopwatch.RestartAndShowCategoreInfo("[Semantic]", "语义节点获取", 3); -#endif - - var errors = semantiModel.GetDiagnostics(); -#if DEBUG - stopwatch.StopAndShowCategoreInfo("[Semantic]", "语义诊断获取", 3); - //stopwatch.Restart(); -#endif - - if (errors.Length > 0) - { -#if DEBUG - stopwatch.Restart(); -#endif - var errorNodes = new HashSet(); - for (int i = 0; i < errors.Length; i++) - { - var error = errors[i]; - //NamespaceName2 中的命名空间 NamespaceName1 与 NamespaceName3 中的类型 TypeName1 冲突 - if (error.Id == "CS0434") - { - error.RemoveDefaultUsingAndUsingNode(root, errorNodes); - } - //无用 using , 不必要的 using 指令。 - else if (error.Id == "CS8019") - { - var node = error.GetTypeSyntaxNode(root); - if (node != null) - { - errorNodes.Add(node); - } - } - //未能找到类型或命名空间名称“type/namespace”(是否缺少 using 指令或程序集引用?) - else if (error.Id == "CS0246") - { - var node = error.GetTypeSyntaxNode(root); - if (node != null) - { - NatashaDiagnosticsExtension.RemoveUsingAndNode(node, errorNodes); - } - } - //命名空间“namespace”中不存在类型或命名空间名“name”(是否缺少程序集引用?) - else if (error.Id == "CS0234") - { - error.RemoveUsingAndNodesFromStartName(root, errorNodes); - } - } - -#if DEBUG - stopwatch.StopAndShowCategoreInfo("[Semantic]", "语义节点筛查", 3); -#endif - if (errorNodes.Count > 0) - { -#if DEBUG - stopwatch.Restart(); -#endif - compilation = compilation.ReplaceSyntaxTree(tree, root.RemoveNodes(errorNodes, SyntaxRemoveOptions.KeepNoTrivia)!.SyntaxTree); -#if DEBUG - stopwatch.StopAndShowCategoreInfo("[Semantic]", "语义节点替换", 3); -#endif - } - - } - - } - return compilation; - }; - } - - } -} diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Configuration/DebugConfiguration.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Configuration/DebugConfiguration.cs deleted file mode 100644 index b089c63a..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Configuration/DebugConfiguration.cs +++ /dev/null @@ -1,38 +0,0 @@ - -using Microsoft.CodeAnalysis.Emit; - -public class DebugConfiguration -{ - - internal DebugInformationFormat _informationFormat = DebugInformationFormat.PortablePdb; - - /// - /// 采用文件加载方式搜集源代码信息,兼容 unix - /// - /// - public DebugConfiguration WriteToFile() - { - _informationFormat = DebugInformationFormat.PortablePdb; - return this; - } - /// - /// 可能不兼容 unix - /// - /// - public DebugConfiguration WriteToFileOriginal() - { - _informationFormat = DebugInformationFormat.Pdb; - return this; - } - /// - /// 将Pdb输出到程序集中,并直接从程序集加载Pdb调试信息 - /// - /// - public DebugConfiguration WriteToAssembly() - { - _informationFormat = DebugInformationFormat.Embedded; - return this; - } - -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/CombineReferenceBehavior.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/CombineReferenceBehavior.cs deleted file mode 100644 index 4b95a45d..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/CombineReferenceBehavior.cs +++ /dev/null @@ -1,8 +0,0 @@ -public enum CombineReferenceBehavior -{ - UseCurrent = 1, - CombineDefault = 2, - UseSpecified = 4 - -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/CompilerBinderFlags.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/CompilerBinderFlags.cs deleted file mode 100644 index 26ba9290..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/CompilerBinderFlags.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System; - -namespace Natasha.CSharp.Compiler -{ - - [Flags] - public enum CompilerBinderFlags : uint - { - None, // No specific location - SuppressConstraintChecks = 1 << 0, - SuppressObsoleteChecks = 1 << 1, - ConstructorInitializer = 1 << 2, - FieldInitializer = 1 << 3, - ObjectInitializerMember = 1 << 4, // object initializer field/property access - CollectionInitializerAddMethod = 1 << 5, // used for collection initializer add method overload resolution diagnostics - AttributeArgument = 1 << 6, - GenericConstraintsClause = 1 << 7, // "where" clause (used for cycle checking) - Cref = 1 << 8, // documentation comment cref - CrefParameterOrReturnType = 1 << 9, // Same as Cref, but lookup considers inherited members - - /// - /// Indicates that the current context allows unsafe constructs. - /// - /// - /// NOTE: Dev10 doesn't seem to treat attributes as being within the unsafe region. - /// Fortunately, not following this behavior should not be a breaking change since - /// attribute arguments have to be constants and there are no constants of unsafe - /// types. - /// - UnsafeRegion = 1 << 10, - - /// - /// Indicates that the unsafe diagnostics are not reported in the current context, regardless - /// of whether or not it is (part of) an unsafe region. - /// - SuppressUnsafeDiagnostics = 1 << 11, - - /// - /// Indicates that this binder is being used to answer SemanticModel questions (i.e. not - /// for batch compilation). - /// - /// - /// Imports touched by a binder with this flag set are not consider "used". - /// - SemanticModel = 1 << 12, - - EarlyAttributeBinding = 1 << 13, - - /// Remarks, mutually exclusive with . - CheckedRegion = 1 << 14, - /// Remarks, mutually exclusive with . - UncheckedRegion = 1 << 15, - - // Each of these produces a different diagnostic, so we need separate flags. - InLockBody = 1 << 16, // body, not the expression - InCatchBlock = 1 << 17, - InFinallyBlock = 1 << 18, - InTryBlockOfTryCatch = 1 << 19, // try block must have at least one catch clause - InCatchFilter = 1 << 20, - - // Indicates that this binder is inside of a finally block that is nested inside - // of a catch block. This flag resets at every catch clause in the binder chain. - // This flag is only used to support CS0724. Implies that InFinallyBlock and - // InCatchBlock are also set. - InNestedFinallyBlock = 1 << 21, - - IgnoreAccessibility = 1 << 22, - - ParameterDefaultValue = 1 << 23, - - /// - /// In the debugger, one can take the address of a managed object. - /// - AllowManagedAddressOf = 1 << 24, - - /// - /// In the debugger, the context is always unsafe, but one can still await. - /// - AllowAwaitInUnsafeContext = 1 << 25, - - /// - /// Ignore duplicate types from the cor library. - /// - IgnoreCorLibraryDuplicatedTypes = 1 << 26, - - /// - /// This is a , or has as its parent. - /// - InContextualAttributeBinder = 1 << 27, - - /// - /// Are we binding for the purpose of an Expression Evaluator - /// - InEEMethodBinder = 1 << 28, - - /// - /// Skip binding type arguments (we use instead). - /// For example, currently used when type constraints are bound in some scenarios. - /// - SuppressTypeArgumentBinding = 1 << 29, - - /// - /// The current context is an expression tree - /// - InExpressionTree = 1 << 30, - - - // Groups - AllClearedAtExecutableCodeBoundary = InLockBody | InCatchBlock | InCatchFilter | InFinallyBlock | InTryBlockOfTryCatch | InNestedFinallyBlock, - } -} diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/Core31Supplement.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/Core31Supplement.cs deleted file mode 100644 index 652d7fef..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/Core31Supplement.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace System.Runtime.CompilerServices -{ - -#if !NET5_0_OR_GREATER - public sealed class SkipLocalsInitAttribute : Attribute { } -#endif - -} \ No newline at end of file diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/UsingLoadBehavior.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/UsingLoadBehavior.cs deleted file mode 100644 index 20bc36cf..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Model/UsingLoadBehavior.cs +++ /dev/null @@ -1,8 +0,0 @@ -public enum UsingLoadBehavior -{ - None = 0, - WithDefault = 1, - WithCurrent = 2, - WithAll = 3 -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/NatashaCSharpCompilerOptions.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/NatashaCSharpCompilerOptions.cs deleted file mode 100644 index 6637a7f4..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/NatashaCSharpCompilerOptions.cs +++ /dev/null @@ -1,297 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Emit; -using Natasha.CSharp.Component.Compiler; -using Natasha.CSharp.Component.Compiler.Utils; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - - -namespace Natasha.CSharp.Compiler -{ - public sealed class NatashaCSharpCompilerOptions - { - - public NatashaCSharpCompilerOptions() - { - _reportDiagnostics = new ConcurrentDictionary(GlobalSupperessCache._globalSuppressDiagnostics); -#if DEBUG - this.WithCompilerFlag(CompilerBinderFlags.IgnoreCorLibraryDuplicatedTypes | CompilerBinderFlags.IgnoreAccessibility | CompilerBinderFlags.GenericConstraintsClause | CompilerBinderFlags.SuppressObsoleteChecks) -#else - this.WithCompilerFlag(CompilerBinderFlags.IgnoreCorLibraryDuplicatedTypes | CompilerBinderFlags.GenericConstraintsClause | CompilerBinderFlags.SuppressObsoleteChecks) -#endif - .WithNullableCompile(NullableContextOptions.Enable) - .WithOutputKind(OutputKind.DynamicallyLinkedLibrary) - .WithPlatform(Platform.AnyCpu); - } - - private readonly ConcurrentDictionary _reportDiagnostics; - - /// - /// 屏蔽错误代码 - /// - /// 错误代码,例如: CS0234 - /// - public NatashaCSharpCompilerOptions AddSupperess(string errorcode) - { - _reportDiagnostics[errorcode] = ReportDiagnostic.Suppress; - return this; - } - - /// - /// 指定错误代码输出的报告级别,一旦发生此错误代码,将会按照报告级别进行报告。 - /// - /// 错误代码例如:CS0234 - /// 报告级别例如:ReportDiagnostic.Error - /// - public NatashaCSharpCompilerOptions SetCodeReportLevel(string errorcode, ReportDiagnostic reportLevel = ReportDiagnostic.Default) - { - _reportDiagnostics[errorcode] = reportLevel; - return this; - } - /// - /// 移除自定义配置的错误代码 - /// - /// - /// - public NatashaCSharpCompilerOptions RemoveSupperess(string errorcode) - { - _reportDiagnostics.Remove(errorcode); - return this; - } - - - private bool _suppressReportShut = false; - /// - /// 启用禁断的报告 - /// - /// - public NatashaCSharpCompilerOptions WithSuppressReportor() - { - _suppressReportShut = true; - return this; - } - /// - /// 关闭禁断的报告(默认) - /// - /// - public NatashaCSharpCompilerOptions WithoutSuppressReportor() - { - _suppressReportShut = false; - return this; - } - - /// - /// 将诊断信息作为什么等级输出,如果重置了标记,比如 Error, 则所有诊断信息都将作为 Error 级别输出。 - /// 一旦你有 Diagnostic 产生,则编译失败。默认为: Default - /// - /// - /// - public NatashaCSharpCompilerOptions WithDiagnosticLevel(ReportDiagnostic reportDiagnostic = ReportDiagnostic.Default) - { - _reportLevel = reportDiagnostic; - return this; - } - - private ReportDiagnostic _reportLevel = ReportDiagnostic.Default; - - private NullableContextOptions _nullableCompileOption; - /// - /// 设置可空引用的检查级别,默认开启 - /// - /// - /// - public NatashaCSharpCompilerOptions WithNullableCompile(NullableContextOptions flag) - { - _nullableCompileOption = flag; - return this; - } - - - private Platform _processorPlatform; - /// - /// 设置平台属性,默认 AnyCpu - /// - /// - /// - public NatashaCSharpCompilerOptions WithPlatform(Platform flag) - { - _processorPlatform = flag; - return this; - } - - private OutputKind _assemblyKind; - /// - /// 设置输出类型,默认 OutputKind.DynamicallyLinkedLibrary - /// - /// - /// - public NatashaCSharpCompilerOptions WithOutputKind(OutputKind flag) - { - _assemblyKind = flag; - return this; - } - - private bool _allowUnsafe; - /// - /// 允许使用非安全代码编译(默认) - /// - /// - public NatashaCSharpCompilerOptions WithUnsafeCompile() - { - _allowUnsafe = true; - return this; - } - /// - /// 不允许使用非安全代码编译 - /// - /// - public NatashaCSharpCompilerOptions WithoutUnsafeCompile() - { - _allowUnsafe = false; - return this; - } - - - private bool _referencesSupersedeLowerVersions; - /// - /// 不禁用低版本程序集 - /// - public NatashaCSharpCompilerOptions WithLowerVersionsAssembly() - { - _referencesSupersedeLowerVersions = true; - return this; - } - /// - /// 禁用低版本程序集(默认) - /// - public NatashaCSharpCompilerOptions WithoutLowerVersionsAssembly() - { - _referencesSupersedeLowerVersions = false; - return this; - } - - - private CompilerBinderFlags _compileFlags; - /// - /// 绑定编译标识 - /// - /// - public NatashaCSharpCompilerOptions WithCompilerFlag(CompilerBinderFlags flags) - { - _compileFlags = flags; - return this; - } - - /// - /// 增加编译标识 - /// - /// - /// - public NatashaCSharpCompilerOptions AppendCompilerFlag(params CompilerBinderFlags[] flags) - { - for (int i = 0; i < flags.Length; i++) - { - _compileFlags |= flags[i]; - } - return this; - } - - /// - /// 移除 IgnoreAccessibility 标识 - /// - /// - public NatashaCSharpCompilerOptions RemoveIgnoreAccessibility() - { - if (_compileFlags.HasFlag(CompilerBinderFlags.IgnoreAccessibility)) - { - _compileFlags = (uint)_compileFlags - CompilerBinderFlags.IgnoreAccessibility; - } - return this; - } - - private MetadataImportOptions _metadataImportOptions; - /// - /// 导入公共元数据(默认) - /// - /// - public NatashaCSharpCompilerOptions WithPublicMetadata() { - _metadataImportOptions = MetadataImportOptions.Public; - return this; - } - /// - /// 导入内部元数据 - /// - /// - public NatashaCSharpCompilerOptions WithInternalMetadata() - { - _metadataImportOptions = MetadataImportOptions.Internal; - return this; - } - /// - /// 导入全部元数据 - /// - /// - public NatashaCSharpCompilerOptions WithAllMetadata() - { - _metadataImportOptions = MetadataImportOptions.All; - return this; - } - /// - /// 获取构建编译信息的选项 - /// - /// - internal CSharpCompilationOptions GetCompilationOptions(OptimizationLevel optimizationLevel,bool withDebugInfo) - { - var compilationOptions = new CSharpCompilationOptions( - //deterministic: true, - nullableContextOptions: _nullableCompileOption, - //strongNameProvider: a, - deterministic: false, - concurrentBuild: true, - moduleName: Guid.NewGuid().ToString(), - reportSuppressedDiagnostics: _suppressReportShut, - metadataImportOptions: _metadataImportOptions, - outputKind: _assemblyKind, - optimizationLevel: optimizationLevel, - allowUnsafe: _allowUnsafe, - platform: _processorPlatform, - checkOverflow: false, - generalDiagnosticOption: _reportLevel); - if (_compileFlags != 0) - { - CompilerInnerHelper.SetTopLevelBinderFlagDelegate(compilationOptions, (uint)_compileFlags); - } - //CS1704 - CompilerInnerHelper.SetReferencesSupersedeLowerVersionsDelegate(compilationOptions, _referencesSupersedeLowerVersions); - //Release with debugInfo (have a good il) - CompilerInnerHelper.SetDebugPlusModeDelegate(compilationOptions, withDebugInfo); - return compilationOptions; - - } - - - ///// - ///// 获取编译选项 - ///// - ///// - ///// - //public CSharpCompilation GetCompilation() - //{ - // if (_compilation==default) - // { - // _compilation = CSharpCompilation.Create(AssemblyName, null, Domain.GetCompileReferences(), GetCompilationOptions()); - // } - // return _compilation.RemoveAllSyntaxTrees(); - - //} - - - } -} - - - - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Utils/CompilerInnerHelper.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Utils/CompilerInnerHelper.cs deleted file mode 100644 index f251fe57..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/Utils/CompilerInnerHelper.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Microsoft.CodeAnalysis.CSharp; -using System; -using System.Reflection; - -namespace Natasha.CSharp.Component.Compiler.Utils -{ - internal static class CompilerInnerHelper - { - internal static readonly Action SetTopLevelBinderFlagDelegate; - internal static readonly Action SetReferencesSupersedeLowerVersionsDelegate; - internal static readonly Action SetDebugPlusModeDelegate; - - static CompilerInnerHelper() - { - SetTopLevelBinderFlagDelegate = (Action)Delegate.CreateDelegate( - typeof(Action), typeof(CSharpCompilationOptions) - .GetProperty("TopLevelBinderFlags", BindingFlags.Instance | BindingFlags.NonPublic)! - .SetMethod!); - - SetReferencesSupersedeLowerVersionsDelegate = (Action)Delegate.CreateDelegate( - typeof(Action), typeof(CSharpCompilationOptions) - .GetProperty("ReferencesSupersedeLowerVersions", BindingFlags.Instance | BindingFlags.NonPublic)! - .SetMethod!); - - SetDebugPlusModeDelegate = (Action)Delegate.CreateDelegate( - typeof(Action), typeof(CSharpCompilationOptions) - .GetProperty("DebugPlusMode", BindingFlags.Instance | BindingFlags.NonPublic)! - .SetMethod!); - - //var list = typeof(CSharpCompilationOptions).GetProperties(BindingFlags.Instance | BindingFlags.NonPublic); - - //SetEnableEditAndContinueDelegate = (Action)Delegate.CreateDelegate( - // typeof(Action), typeof(CSharpCompilationOptions) - // .GetProperty("EnableEditAndContinue", BindingFlags.Instance | BindingFlags.NonPublic)! - // .SetMethod!); - } - } -} diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Exception/Model/ExceptionKind.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Exception/Model/ExceptionKind.cs deleted file mode 100644 index 66d4b7fa..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Exception/Model/ExceptionKind.cs +++ /dev/null @@ -1,11 +0,0 @@ -public enum NatashaExceptionKind -{ - None, - Assembly, - Type, - Method, - Delegate, - Syntax, - Compile -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Exception/Model/NatashaException.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Exception/Model/NatashaException.cs deleted file mode 100644 index 448ad0d0..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Exception/Model/NatashaException.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Microsoft.CodeAnalysis; -using System; -using System.Collections.Generic; - - - -[Serializable] -public sealed class NatashaException : Exception -{ - - public NatashaException(string message) : base(message) - { - Formatter = string.Empty; - Diagnostics = new List(); - ErrorKind = NatashaExceptionKind.None; - CompileMessage = string.Empty; - } - - //格式化后的脚本字符串 - public string Formatter; - - //错误类型 - public NatashaExceptionKind ErrorKind; - - //roslyn诊断集合 - public List Diagnostics; - - /// - /// 详细的编译信息 - /// - public string CompileMessage; - -} - - - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Exception/NatashaExceptionAnalyzer.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Exception/NatashaExceptionAnalyzer.cs deleted file mode 100644 index 05b69919..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Exception/NatashaExceptionAnalyzer.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using System.Collections.Immutable; -using System.Linq; - -namespace Natasha.CSharp.Component.Exception -{ - internal sealed class NatashaExceptionAnalyzer - { - - internal static NatashaException? GetSyntaxException(SyntaxTree tree) - { - - var diagnostics = tree.GetDiagnostics(); - var errors = diagnostics.Where(item => !item.IsSuppressed).ToArray(); - if (errors.Length>0) - { - var first = errors[0]; - var exception = new NatashaException(first.GetMessage()); - exception.Diagnostics.AddRange(errors); - exception.Formatter = tree.ToString(); - exception.ErrorKind = NatashaExceptionKind.Syntax; - return exception; - } - return null; - - } - - internal static NatashaException GetCompileException(CSharpCompilation compilation, ImmutableArray errors) - { - var first = errors[0]; - var exception = new NatashaException(first.GetMessage()); - exception.Diagnostics.AddRange(errors); - if (first.Location.SourceTree!=null) - { - exception.Formatter = first.Location.SourceTree.ToString(); - } - exception.CompileMessage = $"编译程序集为:{compilation.AssemblyName};CSharp版本:{compilation.LanguageVersion};"; - exception.ErrorKind = NatashaExceptionKind.Compile; - return exception; - } - } -} diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Metadata/NatashaReferenceCache.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Metadata/NatashaReferenceCache.cs deleted file mode 100644 index 409af694..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Metadata/NatashaReferenceCache.cs +++ /dev/null @@ -1,69 +0,0 @@ -using Microsoft.CodeAnalysis; -using System.Collections.Generic; -using System.Reflection; - -namespace Natasha.CSharp.Component -{ - //与元数据相关 - //数据值与程序集及内存相关 - public static class NatashaReferenceCache - { - /// - /// 存放内存流编译过来的程序集与引用 - /// - private static readonly HashSet _referenceCache; - static NatashaReferenceCache() - { - _referenceCache = new(); - } - - public static int Count { get { return _referenceCache.Count; } } - - public static void AddReference(string path) - { - DefaultUsing.AddUsing(Assembly.ReflectionOnlyLoadFrom(path)); - AddReference(MetadataReference.CreateFromFile(path)); - } - public static void AddReference(Assembly assembly) - { - DefaultUsing.AddUsing(assembly); - if (!string.IsNullOrEmpty(assembly.Location)) - { - AddReference(MetadataReference.CreateFromFile(assembly.Location)); - } - } - public static void RemoveReference(string path) - { - RemoveReference(MetadataReference.CreateFromFile(path)); - } - public static void RemoveReference(Assembly assembly) - { - if (!string.IsNullOrEmpty(assembly.Location)) - { - RemoveReference(MetadataReference.CreateFromFile(assembly.Location)); - } - } - - private static void RemoveReference(MetadataReference reference) - { - lock (_referenceCache) - { - _referenceCache.Remove(reference); - } - } - - private static void AddReference(MetadataReference reference) - { - lock (_referenceCache) - { - _referenceCache.Add(reference); - } - } - - public static IEnumerable GetReferences() - { - return _referenceCache; - } - - } -} \ No newline at end of file diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/NLog/NatashaCompilationLog.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/NLog/NatashaCompilationLog.cs deleted file mode 100644 index 7a14a084..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/NLog/NatashaCompilationLog.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -public sealed class NatashaCompilationLog -{ - public NatashaCompilationLog() - { - _csInfo = string.Empty; - Messages = new(); - CompilationInfomations = new(); - } - - public bool HasError; - - private string _csInfo; - - public string CompilationsSerializableInfomation - { - get - { - if (_csInfo == string.Empty) - { - _csInfo = $"AssemblyName:{CompilationInfomations["AssemblyName"]};Time:{DateTime.Now:yyyy-MM-dd HH:mm:ss};Language:{CompilationInfomations["Language"]};LanguageVersion:{CompilationInfomations["LanguageVersion"]};ReferencesCount:{CompilationInfomations["ReferencesCount"]}"; - } - return _csInfo; - } - } - - public readonly List Messages; - - public readonly Dictionary CompilationInfomations; - - internal void AddCompilationInfo(string key, string value) - { - CompilationInfomations[key] = value; - } - - internal void AddMessage(int count,string code,string message) - { - Messages.Add(new(count, code, message)); - } - - public override string ToString() - { - StringBuilder result = new StringBuilder(); - result.AppendLine($"{Environment.NewLine}============================== {(HasError?"ERROR":"SUCCEED")} : {CompilationInfomations["AssemblyName"]} =============================="); - if (HasError) - { - foreach (var item in Messages) - { - result.AppendLine($"{Environment.NewLine}------------------------------------------------------------------------------------------------------{Environment.NewLine}"); - result.AppendLine(item.Code); - result.AppendLine($"{Environment.NewLine}{item.Message}"); - } - - } - else - { - foreach (var item in Messages) - { - result.AppendLine($"{Environment.NewLine}------------------------------------------------- {item.Message} -------------------------------------------{Environment.NewLine}"); - result.AppendLine(item.Code); - } - } - - result.AppendLine($"{Environment.NewLine}------------------------------------------------------------------------------------------------------"); - result.AppendLine($"{Environment.NewLine} Time :\t{DateTime.Now:yyyy-MM-dd HH:mm:ss}"); - result.AppendLine($"{Environment.NewLine} Language :\t{CompilationInfomations["Language"]} & {CompilationInfomations["LanguageVersion"]}"); - result.AppendLine($"{Environment.NewLine} TreeCount:\t共 {CompilationInfomations["SyntaxTreeCount"]} 个"); - result.AppendLine($"{Environment.NewLine} RefCount :\t共 {CompilationInfomations["ReferencesCount"]} 个"); - result.AppendLine($"{Environment.NewLine}------------------------------------------------------------------------------------------------------"); - result.AppendLine($"{Environment.NewLine}======================================================================================================"); - return result.ToString(); - } - - -} - -public class NatashaCompilationMessage -{ - private readonly int _count; - private readonly string _code; - private readonly string _message; - public NatashaCompilationMessage(int count, string code,string message) - { - _count = count; - _code = code; - _message = message; - } - public int ErrorCount { get { return _count; } } - public string Code { get { return _code; } } - public string Message { get { return _message; } } - -} - - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Syntax/NatashaCSharpSyntax.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Syntax/NatashaCSharpSyntax.cs deleted file mode 100644 index 786e42f2..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Syntax/NatashaCSharpSyntax.cs +++ /dev/null @@ -1,107 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using System; - -namespace Natasha.CSharp.Syntax -{ - internal static class NatashaCSharpSyntax - { - - //private readonly static AdhocWorkspace _workSpace; - private readonly static CSharpParseOptions _options; - //private readonly static OptionSet _formartOptions; - static NatashaCSharpSyntax() - { - - _options = new CSharpParseOptions(LanguageVersion.Preview); - #region Settings - //var workspace = new AdhocWorkspace(); - //_formartOptions = workspace.Options; - ////_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.IndentBraces, true); - ////_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.IndentBlock, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.IndentSwitchCaseSection, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.IndentSwitchCaseSectionWhenBlock, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.IndentSwitchSection, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.LabelPositioning, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLineForCatch, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLineForClausesInQuery, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLineForElse, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLineForFinally, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLineForMembersInAnonymousTypes, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLineForMembersInObjectInit, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInAccessors, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInAnonymousMethods, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInAnonymousTypes, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInControlBlocks, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInLambdaExpressionBody, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInMethods, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInObjectCollectionArrayInitializers, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInProperties, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInTypes, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceAfterCast, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceAfterColonInBaseTypeDeclaration, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceAfterComma, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceAfterControlFlowStatementKeyword, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceAfterDot, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceAfterMethodCallName, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceAfterSemicolonsInForStatement, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceBeforeColonInBaseTypeDeclaration, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceBeforeComma, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceBeforeDot, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceBeforeOpenSquareBracket, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceBeforeSemicolonsInForStatement, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceBetweenEmptyMethodCallParentheses, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceBetweenEmptyMethodDeclarationParentheses, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceBetweenEmptySquareBrackets, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpacesIgnoreAroundVariableDeclaration, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceWithinCastParentheses, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceWithinExpressionParentheses, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceWithinMethodCallParentheses, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceWithinMethodDeclarationParenthesis, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceWithinOtherParentheses, false); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpaceWithinSquareBrackets, false); - ////_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpacingAfterMethodDeclarationName, true); - ////_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.SpacingAroundBinaryOperator, _options.Language); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.WrappingKeepStatementsOnSingleLine, true); - //_formartOptions = _formartOptions.WithChangedOption(CSharpFormattingOptions.WrappingPreserveSingleLine, true); - #endregion - - } - - - internal static SyntaxTree ParseTree(string script, CSharpParseOptions? options) - { - if (options==null) - { - options = _options; - } - //Mark1 : 647ms - //Mark2 : 128ms - //Mark : 5.0M (Memory:2023-02-27) - var tree = CSharpSyntaxTree.ParseText(script.Trim(), _options); - return FormartTree(tree, options); - - } - - - /// - /// 直接加载树,并缓存 - /// - /// - /// - internal static SyntaxTree FormartTree(SyntaxTree tree, CSharpParseOptions? options) - { - if (options == null) - { - options = _options; - } - //return tree.GetRoot().NormalizeWhitespace().SyntaxTree; - //Console.ReadKey(); - //Mark : 0.3M (Memory:2023-02-27) - //Roslyn BUG https://github.com/dotnet/roslyn/issues/58150 - return CSharpSyntaxTree.ParseText(tree.GetRoot().NormalizeWhitespace().SyntaxTree.ToString(), options); - } - } -} - - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/Inner/ConcurrentDictionaryExtension.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/Inner/ConcurrentDictionaryExtension.cs deleted file mode 100644 index 3b0f92c6..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/Inner/ConcurrentDictionaryExtension.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Collections.Concurrent; - -static class ConcurrentDictionaryExtension -{ - public static S? Remove(this ConcurrentDictionary dict, T key) where T : notnull where S : notnull - { - - while (!dict.TryRemove(key, out var result)) - { - if (!dict.ContainsKey(key)) - { - return result; - } - } - return default; - - } -} diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/Inner/StopwatchExtension.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/Inner/StopwatchExtension.cs deleted file mode 100644 index ea92d123..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/Inner/StopwatchExtension.cs +++ /dev/null @@ -1,215 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Diagnostics; -using System.Text; -using System.Threading; - - -internal static class StopwatchExtension -{ - internal static bool _enableMemroryMonitor; - private static long _preThreadId; - private static readonly object _lock; - private static readonly ConcurrentDictionary _colorCache; - private static readonly ConcurrentDictionary _memoryCache; - private static long _preMemorySize; - static StopwatchExtension() - { - _preMemorySize = 0; - _lock = new object(); - _colorCache = new ConcurrentDictionary(); - _memoryCache = new ConcurrentDictionary(); - - _colorCache[new ScoreRange(0, 20)] = ConsoleColor.Green; - _memoryCache[new ScoreRange(0, 5)] = ConsoleColor.Green; - - _colorCache[new ScoreRange(20, 100)] = ConsoleColor.Cyan; - _memoryCache[new ScoreRange(5, 10)] = ConsoleColor.Cyan; - - _colorCache[new ScoreRange(100, 500)] = ConsoleColor.Yellow; - _memoryCache[new ScoreRange(10, 50)] = ConsoleColor.Yellow; - - _colorCache[new ScoreRange(500, 1000)] = ConsoleColor.Magenta; - _memoryCache[new ScoreRange(50, 100)] = ConsoleColor.Magenta; - - _colorCache[new ScoreRange(1000, 100000)] = ConsoleColor.Red; - _memoryCache[new ScoreRange(100, 100000)] = ConsoleColor.Magenta; - } - - - internal static void EnableMemoryMonitor() - { - _enableMemroryMonitor = true; - } - - internal static void StartMonitor(this Stopwatch stopwatch) - { - if (!_enableMemroryMonitor) - { - stopwatch.Start(); - } - } - - private static long GetMemorySize() - { - return Process.GetCurrentProcess().PrivateMemorySize64 / 1024 / 1024; - } - - - internal static void StopAndShowCategoreInfo(this Stopwatch stopwatch, string nodeName, string info, int level) - { - if (_enableMemroryMonitor) - { - long currentMemorySize = GetMemorySize(); - while (true) - { - Thread.Sleep(3000); - if (currentMemorySize != GetMemorySize()) - { - currentMemorySize = GetMemorySize(); - } - else - { - break; - } - } - ShowCategoreInfo(stopwatch, nodeName, info, level, currentMemorySize); - } - else - { - stopwatch.Stop(); - ShowCategoreInfo(stopwatch, nodeName, info, level); - } - } - - - internal static void RestartAndShowCategoreInfo(this Stopwatch stopwatch, string nodeName, string info, int level) - { - if (_enableMemroryMonitor) - { - long currentMemorySize = GetMemorySize(); - while (true) - { - Thread.Sleep(3000); - if (currentMemorySize != GetMemorySize()) - { - currentMemorySize = GetMemorySize(); - } - else - { - break; - } - } - ShowCategoreInfo(stopwatch, nodeName, info, level, currentMemorySize); - } - else - { - stopwatch.Stop(); - ShowCategoreInfo(stopwatch, nodeName, info, level); - stopwatch.Restart(); - } - } - - - - internal static void ShowCategoreInfo(Stopwatch stopwatch, string nodeName, string info, int level, long currentMemorySize = 0) - { - if (_enableMemroryMonitor) - { - var realSize = 0L; - lock (_lock) - { - realSize = currentMemorySize - _preMemorySize; - _preMemorySize = currentMemorySize; - } - foreach (var item in _memoryCache) - { - if (item.Key.IsInRange(realSize)) - { - var showInfo = new StringBuilder(); - for (int i = 0; i < level; i += 1) - { - showInfo.Append("\t"); - } - showInfo.Append($"└─ {nodeName}\t{info} : {(realSize > 0 ? "+" : "")}{realSize}M / {currentMemorySize}M (change/total)"); - ShowWithThreadInfo(showInfo, item.Value); - break; - } - } - - - - } - else - { - foreach (var item in _colorCache) - { - if (item.Key.IsInRange(stopwatch.ElapsedMilliseconds)) - { - var showInfo = new StringBuilder(); - for (int i = 0; i < level; i += 1) - { - showInfo.Append("\t"); - } - showInfo.Append($"└─ {nodeName}\t{info} : {stopwatch.ElapsedMilliseconds}ms"); - ShowWithThreadInfo(showInfo, item.Value); - break; - } - } - } - } - - private static void ShowWithThreadInfo(StringBuilder message, ConsoleColor color) - { - var threadId = Thread.CurrentThread.ManagedThreadId; - message.Append($" (Thread:{threadId})"); - lock (_lock) - { - var oldColor = Console.ForegroundColor; - Console.ForegroundColor = color; - Console.WriteLine(threadId == _preThreadId ? message : $"{Environment.NewLine}{message}"); - Console.ForegroundColor = oldColor; - _preThreadId = threadId; - } - - } - - - /// - /// 设置颜色等级 - /// - /// - /// - /// - /// - internal static Stopwatch SetLevel(this Stopwatch stopwatch, ScoreRange scoreRange, ConsoleColor color) - { - _colorCache[scoreRange] = color; - return stopwatch; - } -} - -/// -/// 分数模型 -/// -internal class ScoreRange -{ - private readonly long _min; - private readonly long _max; - - internal ScoreRange(long min, long max) - { - _min = min; - _max = max; - } - /// - /// 判断得分是否在范围内 - /// - /// - /// - internal bool IsInRange(long score) - { - return _min <= score && score <= _max; - } -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaAssemblyBuilderExtension.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaAssemblyBuilderExtension.cs deleted file mode 100644 index 453d940b..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaAssemblyBuilderExtension.cs +++ /dev/null @@ -1,24 +0,0 @@ -public static class NatashaAssemblyBuilderExtension -{ - public static AssemblyCSharpBuilder SetOutputFolder(this AssemblyCSharpBuilder builder, string folder) - { - builder.OutputFolder = folder; - return builder; - } - public static AssemblyCSharpBuilder SetDllFilePath(this AssemblyCSharpBuilder builder, string dllFilePath) - { - builder.DllFilePath = dllFilePath; - return builder; - } - public static AssemblyCSharpBuilder SetPdbFilePath(this AssemblyCSharpBuilder builder, string pdbFilePath) - { - builder.PdbFilePath = pdbFilePath; - return builder; - } - public static AssemblyCSharpBuilder SetCommentFilePath(this AssemblyCSharpBuilder builder, string commentFilePath) - { - builder.CommentFilePath = commentFilePath; - return builder; - } -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaAssemblyExtension.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaAssemblyExtension.cs deleted file mode 100644 index 8b3370f6..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaAssemblyExtension.cs +++ /dev/null @@ -1,221 +0,0 @@ -using Microsoft.CodeAnalysis; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; - - -public static class NatashaAssemblyExtension -{ - - /// - /// 获取实现程序集的所有元数据引用 - /// - /// - /// - /// - public unsafe static IEnumerable GetDependencyReferences(this Assembly assembly, Func? filter = null) - { - - var assemblyNames = assembly.GetReferencedAssemblies(); - List references = new(assemblyNames.Length); - if (assemblyNames!=null && assemblyNames.Length > 0) - { - foreach (var asmName in assemblyNames) - { - if (asmName != null) - { - var depAssembly = Assembly.Load(asmName); - - if (!string.IsNullOrEmpty(depAssembly.Location)) - { - references.Add(MetadataReference.CreateFromFile(depAssembly.Location)); - } - } - - } - - } - return references; - } - - /// - /// 为统一 Exception 报错, 为 Assembly 封装扩展方法, 反射出类型. - /// - /// 要反射的程序集 - /// 反射的短类名 - /// - public static Type GetTypeFromShortName(this Assembly assembly, string typeName) - { - try - { - return assembly.GetTypes().First(item => item.Name == typeName); - } - catch (Exception ex) - { - throw new NatashaException($"无法在程序集 {assembly.FullName} 中找到该类型 {typeName}!错误信息:{ex.Message}") - { - ErrorKind = NatashaExceptionKind.Type - }; - } - - } - /// - /// 为统一 Exception 报错, 为 Assembly 封装扩展方法, 反射出类中的方法. - /// - /// 要反射的程序集 - /// 反射的短类名 - /// 类中的方法名 - /// - public static MethodInfo GetMethodFromShortName(this Assembly assembly, string typeName, string methodName) - { - - var type = GetTypeFromShortName(assembly, typeName); - try - { - var info = type.GetMethod(methodName); - if (info == null) - { - throw new Exception("获取方法返回空!"); - } - return info!; - } - catch (Exception ex) - { - - throw new NatashaException($"无法在程序集 {assembly.FullName} 中找到类型 {typeName} 对应的 {methodName} 方法!错误信息:{ex.Message}") - { - ErrorKind = NatashaExceptionKind.Method - }; - } - - } - /// - /// 为统一 Exception 报错, 为 Assembly 封装扩展方法, 反射出类中的方法委托. - /// - /// 要反射的程序集 - /// 反射的短类名 - /// 类中的方法名 - /// 委托类型 - /// 绑定信息 - /// - public static Delegate GetDelegateFromShortName(this Assembly assembly, string typeName, string methodName, Type delegateType, object? target = null) - { - - var info = GetMethodFromShortName(assembly, typeName, methodName); - - try - { - - return info.CreateDelegate(delegateType, target); - - } - catch (Exception ex) - { - - throw new NatashaException($"无法将程序集 {assembly.FullName} 类型为 {typeName} 的 {methodName} 方法转成委托 {delegateType.Name}!错误信息:{ex.Message}") - { - ErrorKind = NatashaExceptionKind.Delegate - }; - - } - - } - public static T GetDelegateFromShortName(this Assembly assembly, string typeName, string methodName, object? target = null) where T : Delegate - { - return (T)GetDelegateFromShortName(assembly, typeName, methodName, typeof(T), target); - } - - /// - /// 为统一 Exception 报错, 为 Assembly 封装扩展方法, 反射出类型. - /// - /// 要反射的程序集 - /// 反射的完整类名 - /// - public static Type GetTypeFromFullName(this Assembly assembly, string typeName) - { - - try - { - return assembly.GetTypes().First(item => item.GetDevelopName() == typeName); - } - catch (Exception ex) - { - throw new NatashaException($"无法在程序集 {assembly.FullName} 中找到该类型 {typeName}!错误信息:{ex.Message}") - { - ErrorKind = NatashaExceptionKind.Type - }; - } - - } - - /// - /// 为统一 Exception 报错, 为 Assembly 封装扩展方法, 反射出类中的方法. - /// - /// 要反射的程序集 - /// 反射的完整类名 - /// 类中的方法名 - /// - public static MethodInfo GetMethodFromFullName(this Assembly assembly, string typeName, string methodName) - { - - var type = GetTypeFromFullName(assembly, typeName); - try - { - var info = type.GetMethod(methodName); - if (info == null) - { - throw new Exception("获取方法返回空!"); - } - return info!; - } - catch (Exception ex) - { - - throw new NatashaException($"无法在程序集 {assembly.FullName} 中找到类型 {typeName} 对应的 {methodName} 方法!错误信息:{ex.Message}") - { - ErrorKind = NatashaExceptionKind.Method - }; - - } - - } - - /// - /// 为统一 Exception 报错, 为 Assembly 封装扩展方法, 反射出类中的方法委托. - /// - /// 要反射的程序集 - /// 反射的完整类名 - /// 类中的方法名 - /// 委托类型 - /// 绑定信息 - /// - public static Delegate GetDelegateFromFullName(this Assembly assembly, string typeName, string methodName, Type delegateType, object? target = null) - { - - var info = GetMethodFromFullName(assembly, typeName, methodName); - - try - { - - return info.CreateDelegate(delegateType, target); - - } - catch (Exception ex) - { - - throw new NatashaException($"无法将程序集 {assembly.FullName} 类型为 {typeName} 的 {methodName} 方法转成委托 {delegateType.Name}!错误信息:{ex.Message}") - { - ErrorKind = NatashaExceptionKind.Delegate - }; - - } - - } - public static T GetDelegateFromFullName(this Assembly assembly, string typeName, string methodName, object? target = null) where T : Delegate - { - return (T)GetDelegateFromFullName(assembly, typeName, methodName, typeof(T), target); - } - -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaDiagnosticsExtension.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaDiagnosticsExtension.cs deleted file mode 100644 index 1796e13e..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaDiagnosticsExtension.cs +++ /dev/null @@ -1,60 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using System.Collections.Generic; -using System.Linq; - -namespace Natasha.CSharp -{ - public static class NatashaDiagnosticsExtension - { - public static SyntaxNode GetSyntaxNode(this Diagnostic diagnostic, CompilationUnitSyntax root) - { - return root.FindNode(diagnostic.Location.SourceSpan); - } - public static T? GetTypeSyntaxNode(this Diagnostic diagnostic, CompilationUnitSyntax root) where T : class - { - var node = GetSyntaxNode(diagnostic, root); - while (node is not T && node.Parent != null) - { - node = node!.Parent; - } - return node as T; - } - public static void RemoveDefaultUsingAndUsingNode(this Diagnostic diagnostic, CompilationUnitSyntax root, HashSet removeCollection) - { - var usingNode = GetTypeSyntaxNode(diagnostic, root); - if (usingNode != null) - { - RemoveUsingAndNode(usingNode, removeCollection); - } - } - - public static void RemoveUsingAndNode(this UsingDirectiveSyntax usingDirectiveSyntax, HashSet removeCollection) - { - removeCollection.Add(usingDirectiveSyntax); - var name = usingDirectiveSyntax.Name; - if (name!=null) - { - DefaultUsing.Remove(name.ToString()); - } - - } - - public static void RemoveUsingAndNodesFromStartName(this Diagnostic diagnostic, CompilationUnitSyntax root, HashSet removeCollection) - { - var usingNode = GetTypeSyntaxNode(diagnostic, root); - if (usingNode!=null) - { - var usingNodes = (from usingDeclaration in root.Usings - where usingDeclaration.Name != null && usingDeclaration.Name.ToString().StartsWith(usingNode.Name!.ToString()) - select usingDeclaration).ToList(); - - removeCollection.UnionWith(usingNodes); - DefaultUsing.Remove(usingNodes.Select(item => item.Name!.ToString())); - - } - } - } -} - - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaStringExtension.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaStringExtension.cs deleted file mode 100644 index 550d7f0a..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaStringExtension.cs +++ /dev/null @@ -1,14 +0,0 @@ -public static class NatashaStringExtension -{ - - public static string ToReadonlyScript(this string field) - { -#if NET8_0_OR_GREATER - return $"Unsafe.AsRef(in {field})"; -#else - return $"Unsafe.AsRef({field})"; -#endif - } - -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaTypeExtension.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaTypeExtension.cs deleted file mode 100644 index 30fcf6e4..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/NatashaTypeExtension.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Microsoft.CodeAnalysis; -using System; -using System.Collections.Generic; -using System.Reflection; - - -public static class NatashaTypeExtension -{ - /// - /// 获取类型所在程序集的元数据引用 - /// - /// - /// - /// - public unsafe static IEnumerable GetDependencyReferences(this Type type, Func? filter = null) - { - return type.Assembly.GetDependencyReferences(filter); - } - - public static Delegate GetDelegateFromType(this Type type, string methodName, Type delegateType, object? target = null) - { - var info = type.GetMethod(methodName); - try - { - if (info == null) - { - throw new Exception($"未从{type.FullName}中反射出{methodName}方法!"); - } - return info.CreateDelegate(delegateType, target); - - } - catch (Exception ex) - { - - NatashaException exception = new($"类型为 {type.FullName} 的 {methodName} 方法无法转成委托 {delegateType.Name}!错误信息:{ex.Message}") - { - ErrorKind = NatashaExceptionKind.Delegate - }; - throw exception; - - } - - } - public static T GetDelegateFromType(this Type type, string methodName, object? target = null) where T : Delegate - { - return (T)GetDelegateFromType(type, methodName, typeof(T), target); - } - -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Natasha.CSharp.Compiler.Framework.csproj b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Natasha.CSharp.Compiler.Framework.csproj deleted file mode 100644 index e328b523..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Natasha.CSharp.Compiler.Framework.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - netstandard2.0 - Natasha 的 C# 版编译器,此库为了支持 Framework. - DotNetCore.Natasha.CSharp.Compiler.Framework - 升级到最新版. - Roslyn;IL;Script;Dynamic;Natasha;NMS;Compiler; - true - 1.0.0.0 - 1.0.0.0 - 1.0.0.0 - - - - - - - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/NatashaInitializer.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/NatashaInitializer.cs deleted file mode 100644 index 88ae6599..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/NatashaInitializer.cs +++ /dev/null @@ -1,92 +0,0 @@ -using Microsoft.CodeAnalysis; -using Natasha.CSharp.Component; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using System.Threading; -using System.Threading.Tasks; - -public static class NatashaInitializer -{ - private static readonly object _lock = new(); - - private static bool _isCompleted = false; - public static void Preheating(Func? excludeReferencesFunc = null, bool useLowMemeory = false) - { - - if (!_isCompleted) - { - lock (_lock) - { - if (_isCompleted) - { - return; - } - - _isCompleted = true; - AssemblyCSharpBuilder.HasInitialized = true; - if (excludeReferencesFunc == null) - { - excludeReferencesFunc = (_, _) => false; - } -#if DEBUG - Stopwatch stopwatch = new(); - stopwatch.Start(); -#endif - - DefaultUsing.SetDefaultUsingFilter(excludeReferencesFunc); - IEnumerable? paths = NatashaAsssemblyHelper.GetReferenceAssmeblyFiles(excludeReferencesFunc); - - -#if DEBUG - stopwatch.RestartAndShowCategoreInfo("[Reference]", "过滤初始化引用", 1); -#endif - if (paths != null && paths.Count() > 0) - { - ResolverMetadata(paths); -#if DEBUG - stopwatch.RestartAndShowCategoreInfo("[ Domain ]", "默认信息初始化", 1); -#endif - - AssemblyCSharpBuilder cSharpBuilder = new(); - cSharpBuilder.ConfigCompilerOption(item => item.AddSupperess("CS8019").WithoutSuppressReportor()); - cSharpBuilder.Add("public class A{}"); - var assembly = cSharpBuilder.GetAssembly(); - -#if DEBUG - stopwatch.StopAndShowCategoreInfo("[FirstCompile]", "初始化编译", 1); -#endif - } - - } - } - - } - private static void ResolverMetadata(IEnumerable paths) - { - - var result = Parallel.ForEach(paths, (path) => - { - //Assembly? assembly = null; - try - { - Assembly assembly = Assembly.ReflectionOnlyLoadFrom(path); - NatashaReferenceCache.AddReference(path); - DefaultUsing.AddUsingWithoutCheck(assembly); - } - catch - { - //Console.WriteLine(assembly?.FullName); - } - }); - while (!result.IsCompleted) - { - Thread.Sleep(100); - } - DefaultUsing.ReBuildUsingScript(); - - } - -} \ No newline at end of file diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/NatashaManagement.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/NatashaManagement.cs deleted file mode 100644 index fafd9876..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/NatashaManagement.cs +++ /dev/null @@ -1,76 +0,0 @@ -using Natasha.CSharp.Component; -using System; -using System.Reflection; - -public static partial class NatashaManagement -{ - - - /// - /// 增加元数据引用,编译需要元数据支持. - /// - /// 程序集 - /// - public static bool AddGlobalReference(Assembly assembly) - { - NatashaReferenceCache.AddReference(assembly); - return true; - } - /// - /// 增加元数据引用,编译需要元数据支持. - /// - /// 类型 - /// - public static bool AddGlobalReference(Type type) - { - if (type.Assembly.IsDynamic || type.Assembly.Location == null) - { - return false; - } - NatashaReferenceCache.AddReference(type.Assembly); - return true; - } - /// - /// 增加元数据引用,编译需要元数据支持. - /// - /// 程序集路径 - /// - public static bool AddGlobalReference(string path) - { - NatashaReferenceCache.AddReference(path); - return true; - } - - /// - /// 移除元数据引用,编译需要元数据支持. - /// - /// 程序集 - /// - public static bool RemoveGlobalReference(Assembly assembly) - { - NatashaReferenceCache.AddReference(assembly); - return true; - } - - /// - /// 移除元数据引用,编译需要元数据支持. - /// - /// 类型 - /// - public static bool RemoveGlobalReference(Type type) - { - NatashaReferenceCache.AddReference(type.Assembly); - return true; - } - - /// - /// 移除元数据引用,编译需要元数据支持. - /// - /// 程序集路径 - /// - public static bool RemoveGlobalReference(string path) - { - NatashaReferenceCache.AddReference(path); - return true; - } -} \ No newline at end of file diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/NatashaReferencePathsHelper.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/NatashaReferencePathsHelper.cs deleted file mode 100644 index 0cc5f4e7..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/NatashaReferencePathsHelper.cs +++ /dev/null @@ -1,88 +0,0 @@ - -using Microsoft.CodeAnalysis; -using Microsoft.Extensions.DependencyModel; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; - -internal static class NatashaAsssemblyHelper -{ - internal static Assembly[] GetRuntimeAssemblies() - { - var defaultContext = DependencyContext.Default; - if (defaultContext != null) - { - return new HashSet(defaultContext - .RuntimeLibraries - .SelectMany(lib => lib - .GetDefaultAssemblyNames(defaultContext) - .Select(Assembly.Load))) - .ToArray(); - } - else - { - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); - foreach (var assembly in assemblies) - { - var referenceNames = assembly.GetReferencedAssemblies(); - foreach (var asmName in referenceNames) - { - Assembly.Load(asmName); - } - } - return AppDomain.CurrentDomain.GetAssemblies(); - } - - } - internal static IEnumerable? GetReferenceAssmeblyFiles(Func excludeReferencesFunc) - { - - IEnumerable? paths = null; - try - { - paths = DependencyContext.Default? - .CompileLibraries - .SelectMany(cl => cl.ResolveReferencePaths()) - .ToList(); - } - catch - { - - } - - if (paths == null || !paths.Any()) - { - var refsFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "refs"); - if (Directory.Exists(refsFolder)) - { - paths = Directory.GetFiles(refsFolder); - } - - refsFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ref"); - if (Directory.Exists(refsFolder)) - { - if (paths != null) - { - - var tempPaths = Directory.GetFiles(refsFolder); - if (tempPaths != null && tempPaths!.Length > 0) - { - paths = paths.Concat(tempPaths); - } - - } - else - { - - paths = Directory.GetFiles(refsFolder); - - } - } - } - return paths; - - } -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Reverser/AvailableNameReverser.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Reverser/AvailableNameReverser.cs deleted file mode 100644 index c6dbf204..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Reverser/AvailableNameReverser.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; - -namespace Natasha.CSharp.Reverser -{ - /// - /// 文件可用名反解 - /// - public class AvailableNameReverser - { - - /// - /// 根据类型获取可用名 - /// - /// 类型 - /// - public static string GetAvailableName(Type type) - { - - return type.GetDevelopName().Replace('<', '_').Replace('>', '_').Replace(',', '_').Replace("[", "@").Replace("]", "@"); - - } - - } - -} diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Reverser/TypeNameReverser.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Reverser/TypeNameReverser.cs deleted file mode 100644 index 5cf48573..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Reverser/TypeNameReverser.cs +++ /dev/null @@ -1,240 +0,0 @@ -using System; -using System.Text; - -namespace Natasha.CSharp.Reverser -{ - /// - /// 类名反解器 - /// - public static class TypeNameReverser - { - //private static readonly Func _nullableAttrCheck; - - //static TypeNameReverser() - //{ - // _nullableAttrCheck = (name) => - // { - // return name.Contains("MaybeNullAttribute") - // || name.Contains("AllowNullAttribute") - // //|| name.Contains("NullableAttribute"); - // || name.Contains("NullableContextAttribute"); - // }; - - //} - - /// - /// 类名反解 - /// - /// 类型 - /// - internal static string ReverseFullName(Type type, bool ignoreFlag = false) - { - - string fatherString = string.Empty; - //外部类处理 - if (type.DeclaringType != null && type.FullName != null) - { - fatherString = ReverseFullName(type.DeclaringType, ignoreFlag) + "."; - } - - - //后缀 - StringBuilder Suffix = new StringBuilder(); - - - //数组判别 - while (type!.HasElementType) - { - - if (type.IsArray) - { - - int count = type.GetArrayRank(); - - Suffix.Append("["); - for (int i = 0; i < count - 1; i++) - { - Suffix.Append(","); - } - Suffix.Append("]"); - - } - type = type.GetElementType()!; - - } - - - //泛型判别 - if (type.IsGenericType) - { - - StringBuilder result = new StringBuilder(); - if (string.IsNullOrEmpty(fatherString) && !string.IsNullOrEmpty(type.Namespace) && !string.IsNullOrEmpty(type.FullName)) - { - result.Append(type.Namespace + "."); - } - result.Append($"{type.Name.Split('`')[0]}<"); - bool HasWriteArguments = false; - - - if (type.GenericTypeArguments.Length > 0) - { - - HasWriteArguments = true; - result.Append(ReverseFullName(type.GenericTypeArguments[0], ignoreFlag)); - for (int i = 1; i < type.GenericTypeArguments.Length; i++) - { - - result.Append(','); - result.Append(ReverseFullName(type.GenericTypeArguments[i], ignoreFlag)); - - } - - } - if (!HasWriteArguments) - { - - var types = ((System.Reflection.TypeInfo)type).GenericTypeParameters; - if (types.Length > 0) - { - - if (!ignoreFlag) - { - result.Append(ReverseFullName(types[0], ignoreFlag)); - } - - for (int i = 1; i < types.Length; i++) - { - - result.Append(','); - if (!ignoreFlag) - { - result.Append(ReverseFullName(types[i], ignoreFlag)); - } - - } - - } - - } - - - result.Append('>'); - result.Append(Suffix); - return fatherString + result.ToString(); - - } - else - { - - //特殊类型判别 - if (type == typeof(void)) - { - - return "void"; - - } - if (string.IsNullOrEmpty(fatherString) && !string.IsNullOrEmpty(type.Namespace) && !string.IsNullOrEmpty(type.FullName)) - { - return type.Namespace + "." + type.Name + Suffix; - } - return fatherString + type.Name + Suffix; - - } - } - - - /// - /// 类名反解 - /// - /// 类型 - /// - public static string ReverseTypeName(Type type) - { - - string fatherString = string.Empty; - //外部类处理 - if (type.DeclaringType != null && type.FullName != null) - { - fatherString = ReverseTypeName(type.DeclaringType) + "."; - } - - - //后缀 - StringBuilder Suffix = new StringBuilder(); - - - //数组判别 - while (type.HasElementType) - { - - if (type.IsArray) - { - - int count = type.GetArrayRank(); - - Suffix.Append("["); - for (int i = 0; i < count - 1; i++) - { - Suffix.Append(","); - } - Suffix.Append("]"); - - } - type = type.GetElementType()!; - - } - - //if (type.CustomAttributes.Any(item => _nullableAttrCheck(item.AttributeType.Name))) - //{ - // Suffix.Append('?'); - //} - - //泛型判别 - if (type.IsGenericType) - { - - StringBuilder result = new StringBuilder(); - result.Append($"{type.Name.Split('`')[0]}<"); - - if (type.GenericTypeArguments.Length > 0) - { - - result.Append(ReverseTypeName(type.GenericTypeArguments[0])); - for (int i = 1; i < type.GenericTypeArguments.Length; i++) - { - - result.Append(','); - result.Append(ReverseTypeName(type.GenericTypeArguments[i])); - - } - - } - - result.Append('>'); - result.Append(Suffix); - return fatherString + result.ToString(); - - } - else - { - - //特殊类型判别 - if (type == typeof(void)) - { - - return "void"; - - } - if (string.IsNullOrEmpty(fatherString) && !string.IsNullOrEmpty(type.Namespace) && !string.IsNullOrEmpty(type.FullName)) - { - return type.Name + Suffix; - } - return fatherString + type.Name + Suffix; - - } - - } - } - -} diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Reverser/TypeNatashaExtension.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Reverser/TypeNatashaExtension.cs deleted file mode 100644 index aec501a5..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Reverser/TypeNatashaExtension.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using System.Collections.Generic; -using Natasha.CSharp.Reverser; - -public static class TypeNatashaExtension -{ - - /// - /// 判断是否为值类型,字符串类型,委托类型,Type类型,及委托的子类型其中之一 - /// - /// - /// - public static bool IsSimpleType(this Type type) - { - return type.IsValueType || - type == typeof(string) || - type.IsSubclassOf(typeof(Delegate)) || - type == typeof(Delegate) || - type.IsSubclassOf(typeof(MulticastDelegate)) || - type == typeof(MulticastDelegate) || - type == typeof(Type); - } - - - /// - /// 当前类是否实现了某接口 - /// - /// 要判断的类型 - /// 接口类型 - /// - public static bool IsImplementFrom(this Type type, Type iType) - { - return new HashSet(type.GetInterfaces()).Contains(iType); - } - - - /// - /// 当前类是否实现了某接口 - /// - /// 要判断的类型 - /// 接口类型 - /// - public static bool IsImplementFrom(this Type type) - { - return new HashSet(type.GetInterfaces()).Contains(typeof(T)); - } - - public static HashSet GetAllTypes(this Type type) - { - HashSet result = new(); - type.GetAllTypes(result); - return result; - } - /// - /// 获取与该类型相关的所有类型,例如 List => List<> / int32 - /// - /// - /// - internal static void GetAllTypes(this Type type, HashSet result) - { - - result.Add(type); - if (type.HasElementType) - { - var temp = type.GetElementType(); - temp?.GetAllTypes(result); - - } - else if (type.IsGenericType && type.FullName != null) - { - foreach (var item in type.GetGenericArguments()) - { - item.GetAllTypes(result); - } - } - - } - - - /// - /// 获取所有该类所含的类 List 则返回 List<> , Int32 - /// - /// - /// - public static HashSet GetAllTypes() - { - return typeof(T).GetAllTypes(); - } - - - - /// - /// 将类名替换成 文件名可使用的名字 - /// - /// - /// - public static string GetAvailableName(this Type type) - { - return AvailableNameReverser.GetAvailableName(type); - } - - - /// - /// 获取运行时完整类名 - /// 例如: System.Collections.Generic - /// 例如: System.Collections.Generic - /// - /// - /// - public static string GetDevelopName(this Type type) - { - return TypeNameReverser.ReverseFullName(type); - } - - - /// - /// 获取运行时类名, 例如: List - /// - /// - /// - public static string GetRuntimeName(this Type type) - { - return TypeNameReverser.ReverseTypeName(type); - } - - - /// - /// 获取运行时类名,无标识 - /// System.Collections.Generic.List<> - /// - /// - /// - public static string GetDevelopNameWithoutFlag(this Type type) - { - return TypeNameReverser.ReverseFullName(type, true); - } - - - // - /// 制作范型类型 - /// - /// IType - /// T,S,D - /// - public static Type With(this Type type, params Type[] types) - { - return type.MakeGenericType(types); - } - -} - diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Using/DefaultUsing.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Using/DefaultUsing.cs deleted file mode 100644 index 76e72899..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Using/DefaultUsing.cs +++ /dev/null @@ -1,444 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -/// -/// 全局 using, 初始化时会通过 DependencyModel 获取主域所需的引用 using 字符串. -/// -public static class DefaultUsing -{ - - internal readonly static HashSet _defaultNamesapce; - private static Func _excludeDefaultAssembliesFunc; - private static StringBuilder _usingScriptCache; - public static string UsingScript; - static DefaultUsing() - { - UsingScript = string.Empty; - _usingScriptCache = new StringBuilder(); - _defaultNamesapce = new HashSet(); - _excludeDefaultAssembliesFunc = (_, _) => false; - - } - - public static void SetDefaultUsingFilter(Func excludeDefaultAssembliesFunc) - { - _excludeDefaultAssembliesFunc = excludeDefaultAssembliesFunc; - } - - public static int Count { get { return _defaultNamesapce.Count; } } - - internal static void AddUsing(IEnumerable usings, bool autoRebuildScript = true) - { - try - { - lock (_defaultNamesapce) - { - foreach (var name in usings) - { - if (name.IndexOf('<') == -1) - { - _defaultNamesapce.Add(name); - _usingScriptCache.AppendLine($"using {name!};"); - } - } - if (autoRebuildScript) - { - UsingScript = _usingScriptCache.ToString(); - } - } - } - catch (Exception ex) - { -#if DEBUG - Console.WriteLine(ex.Message); -#endif - } - } - - internal static void AddUsingWithoutCheck(Assembly assembly, bool autoRebuildScript = true) - { - try - { - var tempSets = new HashSet(); - var types = assembly.ExportedTypes; - if (types.Count() > 16) - { - var result = Parallel.ForEach(types, type => - { - - if (type.IsNested && !type.IsNestedPublic) - { - return; - } - - var name = type.Namespace; - lock (tempSets) - { - if (tempSets.Contains(name)) - { - return; - } - } - if (!string.IsNullOrEmpty(name) - && name.IndexOf('<') == -1) - { - if (!_excludeDefaultAssembliesFunc(default!, name)) - { - lock (tempSets) - { - tempSets.Add(name); - } - } -#if DEBUG - else - { - System.Diagnostics.Debug.WriteLine("[排除程序集]:" + name); - } -#endif - - } - }); - while (!result.IsCompleted) - { - Thread.Sleep(100); - } - } - else - { - foreach (var type in types) - { - - if (type.IsNested && !type.IsNestedPublic) - { - continue; - } - - var name = type.Namespace; - - - if (!string.IsNullOrEmpty(name) - && !tempSets.Contains(name) - && name.IndexOf('<') == -1) - { - - if (!_excludeDefaultAssembliesFunc(default!, name)) - { - - tempSets.Add(name); - } -#if DEBUG - else - { - System.Diagnostics.Debug.WriteLine("[排除程序集]:" + name); - } -#endif - } - } - } - - //*/ - - lock (_defaultNamesapce) - { - foreach (var name in tempSets) - { - if (_defaultNamesapce.Add(name)) - { - _usingScriptCache.AppendLine($"using {name};"); - } - } - if (autoRebuildScript) - { - UsingScript = _usingScriptCache.ToString(); - } - } - - } - catch (Exception ex) - { -#if DEBUG - Console.WriteLine(assembly.FullName + ex.Message); -#endif - } - } - - internal static void AddUsingWithoutCheckingkAndInternalUsing(Assembly assembly, bool autoRebuildScript = true) - { - try - { - var tempSets = new HashSet(); - var types = assembly.ExportedTypes; - if (types.Count() > 16) - { - var result = Parallel.ForEach(types, type => - { - - if (type.IsNested && !type.IsNestedPublic) - { - return; - } - - var name = type.Namespace; - - lock (tempSets) - { - if (tempSets.Contains(name)) - { - return; - } - } - - if (!string.IsNullOrEmpty(name) - && !name.StartsWith("Internal") - && name.IndexOf('<') == -1) - { - - if (!_excludeDefaultAssembliesFunc(default!, name)) - { - lock (tempSets) - { - tempSets.Add(name); - } - } -#if DEBUG - else - { - System.Diagnostics.Debug.WriteLine("[排除程序集]:" + name); - } -#endif - } - }); - while (!result.IsCompleted) - { - Thread.Sleep(100); - } - } - else - { - foreach (var type in types) - { - - if (type.IsNested && !type.IsNestedPublic) - { - continue; - } - - var name = type.Namespace; - if (!string.IsNullOrEmpty(name) - && !name.StartsWith("Internal") - && !tempSets.Contains(name) - && name.IndexOf('<') == -1) - { - - if (!_excludeDefaultAssembliesFunc(default!, name)) - { - tempSets.Add(name); - } -#if DEBUG - else - { - System.Diagnostics.Debug.WriteLine("[排除程序集]:" + name); - } -#endif - } - } - } - - //*/ - - lock (_defaultNamesapce) - { - foreach (var name in tempSets) - { - if (_defaultNamesapce.Add(name)) - { - _usingScriptCache.AppendLine($"using {name};"); - } - } - if (autoRebuildScript) - { - UsingScript = _usingScriptCache.ToString(); - } - } - - } - catch (Exception ex) - { -#if DEBUG - Console.WriteLine(assembly.FullName + ex.Message); -#endif - } - } - - /// - /// 添加引用 - /// - /// - public static void AddUsing(Assembly assembly, bool autoRebuildScript = true) - { - try - { - var types = assembly.ExportedTypes; - lock (_defaultNamesapce) - { - foreach (var type in types) - { - if (type.IsNested && !type.IsNestedPublic) - { - continue; - } - - var name = type.Namespace; - if (!string.IsNullOrEmpty(name) - && name.IndexOf('<') == -1 - && !_defaultNamesapce.Contains(name) - ) - { - - if (!_excludeDefaultAssembliesFunc(default!, name)) - { - - _defaultNamesapce.Add(name); - _usingScriptCache.AppendLine($"using {name!};"); - - } -#if DEBUG - else - { - - System.Diagnostics.Debug.WriteLine("[排除程序集]:" + name); - - } -#endif - - } - } - if (autoRebuildScript) - { - UsingScript = _usingScriptCache.ToString(); - } - } - - } - catch (Exception ex) - { -#if DEBUG - Console.WriteLine(assembly.FullName + ex.Message); -#endif - } - } - - public static void ReBuildUsingScript() - { - UsingScript = _usingScriptCache.ToString(); - } - - /// - /// 添加引用 - /// - /// - internal static void AddUsing(AssemblyName assemblyName, bool autoRebuildScript = true) - { - try - { - lock (_defaultNamesapce) - { - var name = assemblyName.Name; - if (!string.IsNullOrEmpty(name) && name.IndexOf('<') == -1 && !_defaultNamesapce.Contains(name)) - { - _defaultNamesapce.Add(name); - _usingScriptCache.AppendLine($"using {name};"); - if (autoRebuildScript) - { - UsingScript = _usingScriptCache.ToString(); - } - } - - } - } - catch (Exception ex) - { -#if DEBUG - Console.WriteLine(assemblyName.FullName + ex.Message); -#endif - } - } - - public static void AddUsing(bool autoRebuildScript = true, params string[] namespaceText) - { - lock (_defaultNamesapce) - { - for (int i = 0; i < namespaceText.Length; i++) - { - var name = namespaceText[i]; - if (!string.IsNullOrEmpty(name) && name.IndexOf('<') == -1 && !_defaultNamesapce.Contains(name)) - { - _defaultNamesapce.Add(name); - _usingScriptCache.AppendLine($"using {name};"); - if (autoRebuildScript) - { - UsingScript = _usingScriptCache.ToString(); - } - } - } - - - } - } - - /// - /// 查询是否存在该命名空间 - /// - /// - /// - public static bool HasElement(string @namespace) - { - lock (_defaultNamesapce) - { - return _defaultNamesapce.Contains(@namespace); - } - } - - - /// - /// 移除命名空间 - /// - /// - public static void Remove(string @namespace, bool autoRebuildScript = true) - { - lock (_defaultNamesapce) - { - if (_defaultNamesapce.Contains(@namespace)) - { - _defaultNamesapce.Remove(@namespace); - _usingScriptCache = _usingScriptCache.Replace($"using {@namespace};{Environment.NewLine}", string.Empty); - if (autoRebuildScript) - { - UsingScript = _usingScriptCache.ToString(); - } - } - } - } - public static void Remove(IEnumerable namespaces, bool autoRebuildScript = true) - { - - lock (_defaultNamesapce) - { - _defaultNamesapce.ExceptWith(namespaces); - foreach (var item in namespaces) - { - _usingScriptCache = _usingScriptCache.Replace($"using {item};{Environment.NewLine}", string.Empty); - if (autoRebuildScript) - { - UsingScript = _usingScriptCache.ToString(); - } - } - } - - } -} \ No newline at end of file diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/SyntaxNodeExtension.cs b/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/SyntaxNodeExtension.cs deleted file mode 100644 index 8162af36..00000000 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Template.Framework/Extension/Inner/SyntaxNodeExtension.cs +++ /dev/null @@ -1,194 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using System.Collections.Generic; -using System.Linq; - -namespace Natasha.CSharp.Extension.Inner -{ - internal static class SyntaxNodeExtension - { - - //internal static CompilationUnitSyntax GetRoot(string content) - //{ - - // SyntaxTree tree = CSharpSyntaxTree.ParseText(content, new CSharpParseOptions(LanguageVersion.Latest)); - // return tree.GetCompilationUnitRoot(); - - //} - - private static IEnumerable GetNodes(SyntaxNode node) - { - return node.DescendantNodes().OfType(); - } - - - - - /// - /// 根据命名空间和类的位置获取类型 - /// - /// 命名空间节点 - /// 命名空间里的第index-1个 类 - /// - internal static string? GetClassName(this SyntaxNode namespaceNode, int index = 0) - { - - return GetDataStructString(namespaceNode, index); - - } - - - - - /// - /// 根据命名空间和结构体的位置获取类型 - /// - /// 命名空间节点 - /// 命名空间里的第index-1个 结构体 - /// - internal static string? GetStructName(this SyntaxNode namespaceNode, int index = 0) - { - - return GetDataStructString(namespaceNode, index); - - } - - - /// - /// 根据命名空间和记录的位置获取类型 - /// - /// 命名空间节点 - /// 命名空间里的第index-1个 Record - /// - internal static string? GetRecordName(this SyntaxNode namespaceNode, int index = 0) - { - - return GetDataStructString(namespaceNode, index); - - } - - - - - /// - /// 根据命名空间和接口的位置获取类型 - /// - /// 命名空间节点 - /// 命名空间里的第index-1个接口 - /// - internal static string GetInterfaceName(this SyntaxNode namespaceNode, int index = 0) - { - - return GetDataStructString(namespaceNode, index); - - } - - - - - /// - /// 根据命名空间和枚举的位置获取类型 - /// - /// 命名空间节点 - /// 命名空间里的第index-1个枚举 - /// - internal static string GetEnumName(this SyntaxNode namespaceNode, int index = 0) - { - - return GetDataStructString(namespaceNode, index); - - } - - - - - - /// - /// 获取命名空间 - /// - /// - /// - /// - internal static SyntaxNode NamespaceNode(this SyntaxTree tree, int namespaceIndex = 0) - { - var root = tree.GetCompilationUnitRoot(); - var namespaceDeclarationSyntaxes = GetNodes(root); - - if (namespaceDeclarationSyntaxes.Any()) - { - return namespaceDeclarationSyntaxes.ElementAt(namespaceIndex); - } - else - { - return root; - } - } - - - - private static string GetDataStructString(SyntaxNode namespaceNode, int index = 0) where T : BaseTypeDeclarationSyntax - { - - var nodes = GetNodes(namespaceNode); - var node = nodes.ElementAtOrDefault(index); - if (node != null) - { - return node.Identifier.Text; - } - return string.Empty; - - } - - - - /// - /// 根据命名空间和方法的位置获取类型 - /// - /// 命名空间节点 - /// 命名空间里的第index-1个方法 - internal static string GetMethodName(this SyntaxNode namespaceNode, int index = 0) - { - - var nodes = GetNodes(namespaceNode); - var node = nodes.ElementAtOrDefault(index); - if (node != null) - { - return node.Identifier.Text; - } - return string.Empty; - - } - - - internal static string GetFirstOopName(this SyntaxTree syntaxTree) - { - var node = syntaxTree.NamespaceNode(); - var result = node.GetClassName(); - if (string.IsNullOrEmpty(result)) - { - result = node.GetStructName(); - if (string.IsNullOrEmpty(result)) - { - result = node.GetRecordName(); - if (string.IsNullOrEmpty(result)) - { - result = node.GetInterfaceName(); - if (string.IsNullOrEmpty(result)) - { - result = node.GetEnumName(); - if (string.IsNullOrEmpty(result)) - { - result = "Not found oop name!"; - } - } - } - } - } - return result!; - } - - - } -} - diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Compile.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Compile.cs similarity index 83% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Compile.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Compile.cs index 30148416..1d3f7f35 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Compile.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Compile.cs @@ -1,7 +1,7 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Emit; -using Natasha.CSharp.Component.Exception; +using Natasha.CSharp.Compiler.Component.Exception; using Natasha.CSharp.Extension.Inner; using System; using System.Collections.Concurrent; @@ -91,57 +91,7 @@ public AssemblyCSharpBuilder SetReferencesFilter(Func>? CompileFailedEvent; - public CSharpCompilation GetAvailableCompilation(Func? initOptionsFunc = null) - { -#if DEBUG - Stopwatch stopwatch = new(); - stopwatch.Start(); -#endif - - //Mark : 26ms - //if (_compileReferenceBehavior == PluginLoadBehavior.None) - //{ - // _compilerOptions.WithLowerVersionsAssembly(); - //} - - var options = _compilerOptions.GetCompilationOptions(_codeOptimizationLevel, _withDebugInfo); - if (initOptionsFunc != null) - { - options = initOptionsFunc(options); - } - IEnumerable references; - if (_combineReferenceBehavior == CombineReferenceBehavior.CombineDefault) - { - references = Domain.GetReferences(_referenceConfiguration); - } - else if (_combineReferenceBehavior == CombineReferenceBehavior.UseCurrent) - { - references = Domain.References.GetReferences(); - } - else - { - references = _specifiedReferences; - } - - if (_referencesFilter != null) - { - references = _referencesFilter(references); - } - - _compilation = CSharpCompilation.Create(AssemblyName, SyntaxTrees, references, options); -#if DEBUG - stopwatch.StopAndShowCategoreInfo("[Compiler]", "获取编译单元", 2); -#endif - - if (EnableSemanticHandler) - { - foreach (var item in _semanticAnalysistor) - { - _compilation = item(this, _compilation, _semanticCheckIgnoreAccessibility); - } - } - return _compilation; - } + private ConcurrentQueue>? _emitOptionHandle; /// /// 处理默认生成的 emitOption 并返回一个新的 @@ -209,6 +159,12 @@ public AssemblyCSharpBuilder WithInjectToDomain() public Assembly GetAssembly() { _compilation ??= GetAvailableCompilation(); + if (Domain!.Name != "Default") + { + Domain.SetAssemblyLoadBehavior(_domainConfiguration._dependencyLoadBehavior); + } + + #if DEBUG Stopwatch stopwatch = new(); @@ -303,7 +259,12 @@ public Assembly GetAssembly() { dllStream.Seek(0, SeekOrigin.Begin); assembly = Domain.LoadAssemblyFromStream(dllStream, null); - CompileSucceedEvent?.Invoke(_compilation, assembly!); + + if (assembly!=null) + { + LoadContext!.LoadMetadataWithAssembly(assembly); + CompileSucceedEvent?.Invoke(_compilation, assembly!); + } } } dllStream.Dispose(); diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.CompileOption.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.CompileOption.cs similarity index 73% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.CompileOption.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.CompileOption.cs index f5e965cf..af817a3f 100644 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/CompileUnit/AssemblyCSharpBuilder.CompileOption.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.CompileOption.cs @@ -1,10 +1,9 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; -using Natasha.CSharp.Compiler; +using Natasha.CSharp.Compiler.Component; using System; +using System.Collections.Generic; using System.Diagnostics; -using Natasha.CSharp.Component; - /// /// 程序集编译构建器 - 编译选项 /// @@ -98,22 +97,49 @@ public AssemblyCSharpBuilder WithFullReleaseCompile() return this; } - public CSharpCompilation GetAvailableCompilation() + + public CSharpCompilation GetAvailableCompilation(Func? initOptionsFunc = null) { + #if DEBUG Stopwatch stopwatch = new(); stopwatch.Start(); #endif - + //Mark : 26ms + //if (_compileReferenceBehavior == PluginLoadBehavior.None) + //{ + // _compilerOptions.WithLowerVersionsAssembly(); + //} + this.CheckNullLoadContext(); var options = _compilerOptions.GetCompilationOptions(_codeOptimizationLevel, _withDebugInfo); - var references = NatashaReferenceCache.GetReferences(); - _compilation = CSharpCompilation.Create(AssemblyName, SyntaxTrees, references, options); + if (initOptionsFunc != null) + { + options = initOptionsFunc(options); + } + IEnumerable references; + if (_combineReferenceBehavior == CombineReferenceBehavior.CombineDefault) + { + references = LoadContext!.GetReferences(_referenceConfiguration); + } + else if (_combineReferenceBehavior == CombineReferenceBehavior.UseCurrent) + { + references = LoadContext!.References.GetReferences(); + } + else + { + references = _specifiedReferences; + } + + if (_referencesFilter != null) + { + references = _referencesFilter(references); + } + _compilation = CSharpCompilation.Create(AssemblyName, SyntaxTrees, references, options); #if DEBUG - stopwatch.RestartAndShowCategoreInfo("[Compiler]", "获取编译单元", 2); + stopwatch.StopAndShowCategoreInfo("[Compiler]", "获取编译单元", 2); #endif - if (EnableSemanticHandler) { foreach (var item in _semanticAnalysistor) @@ -121,13 +147,8 @@ public CSharpCompilation GetAvailableCompilation() _compilation = item(this, _compilation, _semanticCheckIgnoreAccessibility); } } - -#if DEBUG - stopwatch.RestartAndShowCategoreInfo("[Semantic]", "语义处理", 2); -#endif return _compilation; } - } diff --git a/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Domain.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Domain.cs new file mode 100644 index 00000000..3101596d --- /dev/null +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Domain.cs @@ -0,0 +1,68 @@ +using Natasha.DynamicLoad.Base; +using System; +using System.Runtime.CompilerServices; + +/// +/// 程序集编译构建器 - 域 +/// +public sealed partial class AssemblyCSharpBuilder +{ + private NatashaLoadContext? _loadContext; + private DomainConfiguration _domainConfiguration; + + /// + /// 编译单元所在域. + /// + /// + /// + /// + /// + /// //程序集依赖的加载行为将和当前域同步 + /// domain.SetAssemblyLoadBehavior(); + /// //编译单元支持的方法: + /// WithHighVersionDependency + /// WithLowVersionDependency + /// WithDefaultVersionDependency + /// WithCustomVersionDependency + /// + /// + /// + /// + public NatashaLoadContext? LoadContext + { + get + { + return _loadContext; + } + set + { + _loadContext = value; + } + } + + public INatashaDynamicLoadContextBase? Domain + { + get { return _loadContext?.Domain; } + } + + public AssemblyCSharpBuilder ConfigDomain(Action action) + { + action(_domainConfiguration); + this.CheckNullLoadContext(); + if (Domain!.Name != "Default") + { + Domain.SetAssemblyLoadBehavior(_domainConfiguration._dependencyLoadBehavior); + } + return this; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void CheckNullLoadContext() + { + if (_loadContext == null) + { + throw new NullReferenceException("LoadContext 为空!请检查是否调用 NatashaManagement.Preheating 或 NatashaManagement.RegistDomainCreator, 若调用,请检查 Builder 是否创建了域!"); + } + } +} + diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Log.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Log.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Log.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Log.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Ouput.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Ouput.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Ouput.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Ouput.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Semantic.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Semantic.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Semantic.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Semantic.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Syntax.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Syntax.cs similarity index 81% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Syntax.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Syntax.cs index 38ba718a..b45d84f6 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Syntax.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.Syntax.cs @@ -1,7 +1,7 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; -using Natasha.CSharp.Component.Exception; -using Natasha.CSharp.Syntax; +using Natasha.CSharp.Compiler.Component; +using Natasha.CSharp.Compiler.Component.Exception; using System; using System.Collections.Generic; using System.Text; @@ -136,27 +136,30 @@ public AssemblyCSharpBuilder Add(string script, UsingLoadBehavior usingLoadBehav switch (usingLoadBehavior) { case UsingLoadBehavior.WithDefault: - return AddScript(NatashaReferenceDomain.DefaultDomain.UsingRecorder + script); + this.CheckNullLoadContext(); + return AddScript(NatashaLoadContext.DefaultContext.UsingRecorder + script); case UsingLoadBehavior.WithCurrent: - if (Domain == NatashaReferenceDomain.DefaultDomain) + this.CheckNullLoadContext(); + if (Domain!.Name == NatashaLoadContext.DefaultName) { - return AddScript(NatashaReferenceDomain.DefaultDomain.UsingRecorder + script); + return AddScript(NatashaLoadContext.DefaultContext.UsingRecorder + script); } - return AddScript(Domain.UsingRecorder + script); + return AddScript(LoadContext!.UsingRecorder + script); case UsingLoadBehavior.WithAll: - if (Domain == NatashaReferenceDomain.DefaultDomain) + this.CheckNullLoadContext(); + if (Domain!.Name == NatashaLoadContext.DefaultName) { - return AddScript(NatashaReferenceDomain.DefaultDomain.UsingRecorder + script); + return AddScript(NatashaLoadContext.DefaultContext.UsingRecorder + script); } StringBuilder usingBuilder = new(); - foreach (var item in Domain.UsingRecorder._usings) + foreach (var item in LoadContext!.UsingRecorder._usings) { - if (!NatashaReferenceDomain.DefaultDomain.UsingRecorder.HasUsing(item)) + if (!NatashaLoadContext.DefaultContext.UsingRecorder.HasUsing(item)) { usingBuilder.AppendLine($"using {item};"); } } - return AddScript(NatashaReferenceDomain.DefaultDomain.UsingRecorder.ToString() + usingBuilder + script); + return AddScript(NatashaLoadContext.DefaultContext.UsingRecorder.ToString() + usingBuilder + script); default: return AddScript(script); } diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.cs similarity index 71% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.cs index cb85316c..e57e1ade 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/AssemblyCSharpBuilder.cs @@ -30,6 +30,40 @@ public AssemblyCSharpBuilder(string assemblyName) _specifiedReferences = []; } + internal static bool HasInitialized; + /// + /// 清空编译信息, 下次编译重组 Compilation . + /// + /// + public AssemblyCSharpBuilder ClearCompilationCache() + { + _compilation = null; + return this; + } + + /// + /// 清空所有记录,包括编译信息和脚本记录,以及程序集名称. + /// + /// + public AssemblyCSharpBuilder Clear() + { + _compilation = null; + SyntaxTrees.Clear(); + AssemblyName = string.Empty; + return this; + } + + + /// + /// 自动使用 GUID 作为程序集名称. + /// + /// + public AssemblyCSharpBuilder WithRandomAssenblyName() + { + AssemblyName = Guid.NewGuid().ToString("N"); + return this; + } + /// /// 轻便模式:无合并行为,使用当前域的 Using,无语义检查 /// diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/Configuration/DebugConfiguration.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/Configuration/DebugConfiguration.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/Configuration/DebugConfiguration.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/Configuration/DebugConfiguration.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/Configuration/DomainConfiguration.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/Configuration/DomainConfiguration.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/Configuration/DomainConfiguration.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/Configuration/DomainConfiguration.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/Configuration/ReferenceConfiguration.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/Configuration/ReferenceConfiguration.cs similarity index 98% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/Configuration/ReferenceConfiguration.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/Configuration/ReferenceConfiguration.cs index 7e112bc1..6bd89b3a 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/Configuration/ReferenceConfiguration.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/Configuration/ReferenceConfiguration.cs @@ -1,6 +1,6 @@ using System; using System.Reflection; -using Natasha.CSharp.Component.Domain; +using Natasha.CSharp.Component.Load; public class ReferenceConfiguration { diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/SemanticAnalaysis/UsingAnalysistor.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/SemanticAnalaysis/UsingAnalysistor.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/CompileUnit/SemanticAnalaysis/UsingAnalysistor.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/CompileUnit/SemanticAnalaysis/UsingAnalysistor.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Domain/NatashaReferenceCache.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Cache/NatashaMetadataCache.cs similarity index 88% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Domain/NatashaReferenceCache.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Cache/NatashaMetadataCache.cs index c6c38b3f..4b0196f0 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Domain/NatashaReferenceCache.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Cache/NatashaMetadataCache.cs @@ -1,6 +1,5 @@ using Microsoft.CodeAnalysis; -using Natasha.CSharp.Component.Domain; -using Natasha.Domain.Extension; +using Natasha.CSharp.Component.Load; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -9,12 +8,12 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("PluginFunctionUT, PublicKey=002400000480000094000000060200000024000052534131000400000100010069acb31dd0d9918441d6ed2b49cd67ae17d15fd6ded4ccd2f99b4a88df8cddacbf72d5897bb54f406b037688d99f482ff1c3088638b95364ef614f01c3f3f2a2a75889aa53286865463fb1803876056c8b98ec57f0b3cf2b1185de63d37041ba08f81ddba0dccf81efcdbdc912032e8d2b0efa21accc96206c386b574b9d9cb8")] -namespace Natasha.CSharp.Component +namespace Natasha.CSharp.Compiler.Component { //与元数据相关 //数据值与程序集及内存相关 - public sealed class NatashaReferenceCache + public sealed class NatashaMetadataCache : IDisposable { /// /// 存放内存流编译过来的程序集与引用 @@ -22,13 +21,26 @@ public sealed class NatashaReferenceCache private readonly ConcurrentDictionary _referenceCache; private readonly ConcurrentDictionary _referenceNameCache; private readonly List _forceReferenceCache; - public NatashaReferenceCache() + public NatashaMetadataCache() { _referenceCache = new(); _referenceNameCache = new(); _forceReferenceCache = []; } + + public AssemblyName? GetAssmeblyNameByMetadata(MetadataReference metadataReference) + { + foreach (var item in _referenceCache) + { + if (item.Value == metadataReference) + { + return item.Key; + } + } + return null; + } + /// /// 根据程序集名获取引用 /// @@ -110,7 +122,7 @@ public IEnumerable GetReferences() } return _referenceCache.Values.Concat(_forceReferenceCache); } - internal HashSet CombineWithDefaultReferences(NatashaReferenceCache defaultCache, AssemblyCompareInfomation loadBehavior = AssemblyCompareInfomation.None, Func? useAssemblyNameFunc = null) + internal HashSet CombineWithDefaultReferences(NatashaMetadataCache defaultCache, AssemblyCompareInfomation loadBehavior = AssemblyCompareInfomation.None, Func? useAssemblyNameFunc = null) { var sets = new HashSet(_referenceCache.Values); var excludeNods = new HashSet(); @@ -122,7 +134,6 @@ internal HashSet CombineWithDefaultReferences(NatashaReferenc { if (defaultNameReferences.TryGetValue(item.Key, out var defaultAssemblyName)) { - AssemblyLoadVersionResult funcResult; if (useAssemblyNameFunc != null) { @@ -159,5 +170,10 @@ internal HashSet CombineWithDefaultReferences(NatashaReferenc } return sets; } + + public void Dispose() + { + this.Clear(); + } } } \ No newline at end of file diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Using/NatashaUsingCache.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Cache/NatashaUsingCache.cs similarity index 94% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Using/NatashaUsingCache.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Cache/NatashaUsingCache.cs index b6f76b87..9a6fbb58 100644 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Using/NatashaUsingCache.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Cache/NatashaUsingCache.cs @@ -4,12 +4,12 @@ using System.Reflection; using System.Text; -namespace Natasha.CSharp.Using +namespace Natasha.CSharp.Compiler.Component { /// /// 引用模板 /// - public sealed class NatashaUsingCache : IEnumerable + public sealed class NatashaUsingCache : IEnumerable, IDisposable { private bool _changed; public readonly HashSet _usings; @@ -199,6 +199,12 @@ IEnumerator IEnumerable.GetEnumerator() yield return item; } } + + public void Dispose() + { + _usings.Clear(); + _usingScript = string.Empty; + } } } \ No newline at end of file diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/GlobalSupperessCache.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/GlobalSupperessCache.cs similarity index 97% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/GlobalSupperessCache.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/GlobalSupperessCache.cs index 1fab6bbd..02678854 100644 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Component/Compiler/GlobalSupperessCache.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/GlobalSupperessCache.cs @@ -1,7 +1,7 @@ using Microsoft.CodeAnalysis; using System.Collections.Concurrent; -namespace Natasha.CSharp.Component.Compiler +namespace Natasha.CSharp.Compiler.Component { internal static class GlobalSupperessCache { diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/Model/CombineReferenceBehavior.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/Model/CombineReferenceBehavior.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/Model/CombineReferenceBehavior.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/Model/CombineReferenceBehavior.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/Model/CompilerBinderFlags.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/Model/CompilerBinderFlags.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/Model/CompilerBinderFlags.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/Model/CompilerBinderFlags.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/Model/UsingLoadBehavior.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/Model/UsingLoadBehavior.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/Model/UsingLoadBehavior.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/Model/UsingLoadBehavior.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/NatashaCSharpCompilerOptions.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/NatashaCSharpCompilerOptions.cs similarity index 97% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/NatashaCSharpCompilerOptions.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/NatashaCSharpCompilerOptions.cs index 6637a7f4..906158c8 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/NatashaCSharpCompilerOptions.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/NatashaCSharpCompilerOptions.cs @@ -1,15 +1,10 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Emit; -using Natasha.CSharp.Component.Compiler; -using Natasha.CSharp.Component.Compiler.Utils; using System; using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -namespace Natasha.CSharp.Compiler +namespace Natasha.CSharp.Compiler.Component { public sealed class NatashaCSharpCompilerOptions { diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/Utils/CompilerInnerHelper.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/Utils/CompilerInnerHelper.cs similarity index 97% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/Utils/CompilerInnerHelper.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/Utils/CompilerInnerHelper.cs index f251fe57..6bce6468 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Compiler/Utils/CompilerInnerHelper.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Compiler/Utils/CompilerInnerHelper.cs @@ -2,7 +2,7 @@ using System; using System.Reflection; -namespace Natasha.CSharp.Component.Compiler.Utils +namespace Natasha.CSharp.Compiler.Component { internal static class CompilerInnerHelper { diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Domain/DomainManagement.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Domain/DomainManagement.cs similarity index 66% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Domain/DomainManagement.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Domain/DomainManagement.cs index b70f3b1c..c2504e3f 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Domain/DomainManagement.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Domain/DomainManagement.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Concurrent; -using static System.Runtime.Loader.AssemblyLoadContext; public sealed class DomainManagement { @@ -13,22 +12,22 @@ static DomainManagement() } - public static NatashaReferenceDomain Random() + public static NatashaLoadContext Random() { return Create("N" + Guid.NewGuid().ToString("N")); } - public static NatashaReferenceDomain Create(string key) + public static NatashaLoadContext Create(string key) { if (Cache.ContainsKey(key)) { - return (NatashaReferenceDomain)(Cache[key].Target!); + return (NatashaLoadContext)(Cache[key].Target!); } else { Clear(); - var domain = new NatashaReferenceDomain(key); + var domain = new NatashaLoadContext(key); Add(key, domain); return domain; } @@ -48,7 +47,7 @@ public static void Clear() - public static void Add(string key, NatashaReferenceDomain domain) + public static void Add(string key, NatashaLoadContext domain) { if (Cache.ContainsKey(key)) { @@ -63,16 +62,6 @@ public static void Add(string key, NatashaReferenceDomain domain) } } - public static NatashaReferenceDomain CurrentDomain - { - get - { - return CurrentContextualReflectionContext == default ? - NatashaReferenceDomain.DefaultDomain : - (NatashaReferenceDomain)CurrentContextualReflectionContext; - } - } - public static WeakReference Remove(string key) { @@ -81,7 +70,7 @@ public static WeakReference Remove(string key) var result = Cache!.Remove(key); if (result != default) { - ((NatashaReferenceDomain)(result.Target!)).Dispose(); + ((NatashaLoadContext)(result.Target!)).Dispose(); } return result!; } @@ -100,11 +89,11 @@ public static bool IsDeleted(string key) } - public static NatashaReferenceDomain? Get(string key) + public static NatashaLoadContext? Get(string key) { if (Cache.ContainsKey(key)) { - return (NatashaReferenceDomain)Cache[key].Target!; + return (NatashaLoadContext)Cache[key].Target!; } return null; } diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Exception/Model/ExceptionKind.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Exception/Model/ExceptionKind.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Exception/Model/ExceptionKind.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Exception/Model/ExceptionKind.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Exception/Model/NatashaException.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Exception/Model/NatashaException.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Exception/Model/NatashaException.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Exception/Model/NatashaException.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Exception/NatashaExceptionAnalyzer.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Exception/NatashaExceptionAnalyzer.cs similarity index 96% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Exception/NatashaExceptionAnalyzer.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Exception/NatashaExceptionAnalyzer.cs index 05b69919..fdba92ea 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Exception/NatashaExceptionAnalyzer.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Exception/NatashaExceptionAnalyzer.cs @@ -3,7 +3,7 @@ using System.Collections.Immutable; using System.Linq; -namespace Natasha.CSharp.Component.Exception +namespace Natasha.CSharp.Compiler.Component.Exception { internal sealed class NatashaExceptionAnalyzer { diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Metadata/MetadataHelper.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Metadata/MetadataHelper.cs similarity index 96% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Metadata/MetadataHelper.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Metadata/MetadataHelper.cs index c1abf1a4..4ff4de12 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Metadata/MetadataHelper.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Metadata/MetadataHelper.cs @@ -9,16 +9,16 @@ using System.Threading; using System.Threading.Tasks; -namespace Natasha.CSharp.Compiler.Public.Component.Metadata +namespace Natasha.CSharp.Compiler.Component { - internal static class MetadataHelper + public static class MetadataHelper { #region metadata & namespace in memroy public static unsafe (AssemblyName asmName, MetadataReference metadata, HashSet namespaces)? GetMetadataAndNamespaceFromMemory(Assembly assembly, Func? filter = null) { var asmName = assembly.GetName(); - if (assembly.TryGetRawMetadata(out var blob, out var length)) + if (NatashaLoadContext.Creator.TryGetRawMetadata(assembly ,out var blob, out var length)) { if (filter == null || !filter(asmName, asmName.Name)) { @@ -34,7 +34,7 @@ public static unsafe (AssemblyName asmName, MetadataReference metadata, HashSet< public static unsafe (AssemblyName asmName, MetadataReference metadata)? GetMetadataFromMemory(Assembly assembly, Func? filter = null) { var asmName = assembly.GetName(); - if (assembly.TryGetRawMetadata(out var blob, out var length)) + if (NatashaLoadContext.Creator.TryGetRawMetadata(assembly, out var blob, out var length)) { if (filter == null || !filter(asmName, asmName.Name)) { @@ -126,7 +126,7 @@ public static HashSet GetNamespaceFromMemroy(Assembly assembly, Func where TCreator : INatashaDynamicLoadContextCreator, new() +{ + static NatashaLoadContext() + { + NatashaLoadContext.SetLoadContextCreator(); + } + public static void Prepare() { } +} +public sealed class NatashaLoadContext : IDisposable +{ + public INatashaDynamicLoadContextBase Domain; + + internal NatashaLoadContext() + { + Domain = Creator.CreateDefaultContext(); + Domain.SetCallerReference(this); + } + internal NatashaLoadContext(string key) + { + Domain = Creator.CreateContext(key); + Domain.SetCallerReference(this); + } + + public static INatashaDynamicLoadContextCreator Creator = default!; + public const string DefaultName = "Default"; + + public static void SetLoadContextCreator() where TCreator : INatashaDynamicLoadContextCreator, new() + { + Creator = new TCreator(); + DefaultContext = new NatashaLoadContext(); + DomainManagement.Add(DefaultName, DefaultContext); + } + + public static NatashaLoadContext DefaultContext = default!; + + public IEnumerable GetReferences(ReferenceConfiguration configuration) + { + if (Domain.Name == DefaultContext.Domain.Name) + { + return References.GetReferences(); + } + else + { + return References.CombineWithDefaultReferences(DefaultContext.References, configuration._compileReferenceBehavior, configuration._referenceSameNamePickFunc); + } + } + + /// + /// 引用 记录 + /// + public readonly NatashaMetadataCache References = new(); + /// + /// Using 记录 + /// + public readonly NatashaUsingCache UsingRecorder = new(); + + internal void LoadMetadataWithAssembly(Assembly assembly) + { + var result = MetadataHelper.GetMetadataAndNamespaceFromMemory(assembly); + if (result.HasValue) + { + AddReferenceAndUsing(result.Value.asmName, result.Value.metadata, result.Value.namespaces); + } + } + + + public void AddReferenceAndUsing(AssemblyName name, MetadataReference metadataReference, HashSet usings, AssemblyCompareInfomation compareInfomation = AssemblyCompareInfomation.None) + { + References.AddReference(name, metadataReference, compareInfomation); + UsingRecorder.Using(usings); + } + + public void Dispose() + { + References.Dispose(); + UsingRecorder.Dispose(); + Domain.Dispose(); + } +} \ No newline at end of file diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/NLog/NatashaCompilationLog.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/NLog/NatashaCompilationLog.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/NLog/NatashaCompilationLog.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/NLog/NatashaCompilationLog.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Syntax/NatashaCSharpSyntax.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Syntax/NatashaCSharpSyntax.cs similarity index 99% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Syntax/NatashaCSharpSyntax.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Syntax/NatashaCSharpSyntax.cs index 786e42f2..73b0f9f7 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Component/Syntax/NatashaCSharpSyntax.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Component/Syntax/NatashaCSharpSyntax.cs @@ -1,8 +1,7 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; -using System; -namespace Natasha.CSharp.Syntax +namespace Natasha.CSharp.Compiler.Component { internal static class NatashaCSharpSyntax { diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/Inner/CSharpCompilationExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/Inner/CSharpCompilationExtension.cs similarity index 95% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/Inner/CSharpCompilationExtension.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/Inner/CSharpCompilationExtension.cs index e06489b4..fcc64e4b 100644 --- a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/Inner/CSharpCompilationExtension.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/Inner/CSharpCompilationExtension.cs @@ -21,7 +21,7 @@ internal static NatashaCompilationLog GetNatashaLog(this CSharpCompilation compi var errors = compilation.GetDiagnostics(); if (errors.Length > 0) { - Dictionary> syntaxCache = new(); + Dictionary> syntaxCache = []; foreach (var item in compilation.GetDiagnostics()) { if (item.Location.SourceTree != null) @@ -29,7 +29,7 @@ internal static NatashaCompilationLog GetNatashaLog(this CSharpCompilation compi var tree = item.Location.SourceTree; if (!syntaxCache.ContainsKey(tree)) { - syntaxCache[tree] = new List(); + syntaxCache[tree] = []; } syntaxCache[tree].Add(item); } @@ -80,7 +80,7 @@ private static string GetErrorMessage(string content, FileLinePositionSpan lineP else { - return currentErrorLine.Substring(start.Character, end.Character - start.Character).Trim(); + return currentErrorLine.Substring(start.Character, end.Character-start.Character).Trim(); } @@ -89,7 +89,7 @@ private static string GetErrorMessage(string content, FileLinePositionSpan lineP { StringBuilder builder = new(); - builder.AppendLine(currentErrorLine.Substring(start.Character, currentErrorLine.Length-start.Character)); + builder.AppendLine(currentErrorLine.Substring(start.Character, currentErrorLine.Length - start.Character)); for (int i = start.Line; i < end.Line - 1; i += 1) { @@ -118,7 +118,6 @@ private static string AddLineNumber(string code) } } - } diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/Inner/ConcurrentDictionaryExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/Inner/ConcurrentDictionaryExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/Inner/ConcurrentDictionaryExtension.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/Inner/ConcurrentDictionaryExtension.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/Inner/StopwatchExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/Inner/StopwatchExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/Inner/StopwatchExtension.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/Inner/StopwatchExtension.cs diff --git a/src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/Inner/SyntaxNodeExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/Inner/SyntaxNodeExtension.cs similarity index 100% rename from src/Natasha.CSharp/Framework/Natasha.CSharp.Compiler.Framework/Extension/Inner/SyntaxNodeExtension.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/Inner/SyntaxNodeExtension.cs diff --git a/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaAssemblyBuilderExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaAssemblyBuilderExtension.cs new file mode 100644 index 00000000..ace028fc --- /dev/null +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaAssemblyBuilderExtension.cs @@ -0,0 +1,176 @@ +using System; +using Natasha.CSharp.Compiler.Component; +using System.Reflection; +using System.Security.Cryptography; + +public static class NatashaAssemblyBuilderExtension +{ + public static AssemblyCSharpBuilder SetOutputFolder(this AssemblyCSharpBuilder builder, string folder) + { + builder.OutputFolder = folder; + return builder; + } + public static AssemblyCSharpBuilder SetDllFilePath(this AssemblyCSharpBuilder builder, string dllFilePath) + { + builder.DllFilePath = dllFilePath; + return builder; + } + public static AssemblyCSharpBuilder SetPdbFilePath(this AssemblyCSharpBuilder builder, string pdbFilePath) + { + builder.PdbFilePath = pdbFilePath; + return builder; + } + public static AssemblyCSharpBuilder SetCommentFilePath(this AssemblyCSharpBuilder builder, string commentFilePath) + { + builder.CommentFilePath = commentFilePath; + return builder; + } + /// + /// 编译单元使用随机域 + /// + /// 编译单元 + /// + public static AssemblyCSharpBuilder UseRandomDomain(this AssemblyCSharpBuilder builder) + { + builder.LoadContext = DomainManagement.Random(); + return builder; + } + + /// + /// 编译单元使用新的随机域 + /// + /// 编译单元 + /// 域名字 + /// + public static AssemblyCSharpBuilder UseNewDomain(this AssemblyCSharpBuilder builder, string domainName) + { + builder.LoadContext = DomainManagement.Create(domainName); + return builder; + } + + /// + /// 编译单元使用新的随机域 + /// + /// 编译单元 + /// + public static AssemblyCSharpBuilder UseDefaultDomain(this AssemblyCSharpBuilder builder) + { + builder.LoadContext = NatashaLoadContext.DefaultContext; + return builder; + } + + /// + /// 根据类型所在的 Assmely及其引用的程序集 增加元数据 和 using + /// + /// Natasha 编译单元 + /// 要添加引用的类型 + /// 加载行为 + public static AssemblyCSharpBuilder AddReferenceAndUsingCode(this AssemblyCSharpBuilder builder, Type type, AssemblyCompareInfomation loadReferenceBehavior = AssemblyCompareInfomation.None) + { + return AddReferenceAndUsingCode(builder, type.Assembly, null, loadReferenceBehavior); + } + /// + /// 根据类型所在的 Assmely及其引用的程序集 增加元数据 和 using + /// + /// Natasha 编译单元 + /// 类型 + /// 过滤委托 + public static AssemblyCSharpBuilder AddReferenceAndUsingCode(this AssemblyCSharpBuilder builder, Type type, Func excludeAssembliesFunc) + { + return AddReferenceAndUsingCode(builder, type.Assembly, excludeAssembliesFunc, AssemblyCompareInfomation.None); + } + + /// + /// 根据 Assmely及其引用的程序集 增加元数据 和 using + /// + /// Natasha 编译单元 + /// 程序集 + /// 过滤委托 + public static AssemblyCSharpBuilder AddReferenceAndUsingCode(this AssemblyCSharpBuilder builder, Assembly assembly, Func excludeAssembliesFunc) + { + return AddReferenceAndUsingCode(builder, assembly, excludeAssembliesFunc, AssemblyCompareInfomation.None); + } + + /// + /// 根据 Assmely及其引用的程序集 增加元数据 和 using + /// + /// Natasha 编译单元 + /// 程序集 + /// 加载行为 + public static AssemblyCSharpBuilder AddReferenceAndUsingCode(this AssemblyCSharpBuilder builder, Assembly assembly, AssemblyCompareInfomation loadReferenceBehavior) + { + return AddReferenceAndUsingCode(builder, assembly, null, loadReferenceBehavior); + } + + /// + /// 根据 Assmely及其引用的程序集 增加元数据 和 using + /// + /// Natasha 编译单元 + /// 程序集 + /// 过滤委托 + /// 加载行为 + public static AssemblyCSharpBuilder AddReferenceAndUsingCode(this AssemblyCSharpBuilder builder, Assembly assembly, Func? excludeAssembliesFunc = null, AssemblyCompareInfomation loadReferenceBehavior = AssemblyCompareInfomation.None) + { + builder.CheckNullLoadContext(); + var result = MetadataHelper.GetMetadataAndNamespaceFromMemory(assembly, null); + if (result.HasValue) + { + builder.LoadContext!.AddReferenceAndUsing(result.Value.asmName, result.Value.metadata, result.Value.namespaces, loadReferenceBehavior); + var assmblies = NatashaLoadContext.Creator.GetDependencyAssemblies(assembly); + if (assmblies != null) + { + if (excludeAssembliesFunc!=null) + { + foreach (var depAssembly in assmblies) + { + var asmName = depAssembly.GetName(); + if (!builder.LoadContext.References.HasReference(asmName) && !excludeAssembliesFunc(asmName)) + { + result = MetadataHelper.GetMetadataAndNamespaceFromMemory(depAssembly, null); + if (result.HasValue) + { + builder.LoadContext.AddReferenceAndUsing(asmName, result.Value.metadata, result.Value.namespaces, loadReferenceBehavior); + } + } + } + } + else + { + foreach (var depAssembly in assmblies) + { + System.Diagnostics.Debug.WriteLine("-----------" + depAssembly.FullName); + var asmName = depAssembly.GetName(); + if (!builder.LoadContext.References.HasReference(asmName)) + { + result = MetadataHelper.GetMetadataAndNamespaceFromMemory(depAssembly, null); + if (result.HasValue) + { + builder.LoadContext.AddReferenceAndUsing(asmName, result.Value.metadata, result.Value.namespaces, loadReferenceBehavior); + } + } + } + } + + } + } + return builder; + } + + /// + /// 增加引用 和 using + /// + /// Natasha 编译单元 + /// 文件路径 + /// 加载行为 + public static AssemblyCSharpBuilder AddReferenceAndUsingCode(this AssemblyCSharpBuilder builder, string path, AssemblyCompareInfomation loadReferenceBehavior = AssemblyCompareInfomation.None) + { + builder.CheckNullLoadContext(); + var result = MetadataHelper.GetMetadataAndNamespaceFromFile(path, null); + if (result.HasValue) + { + builder.LoadContext!.AddReferenceAndUsing(result.Value.asmName, result.Value.metadata, result.Value.namespaces, loadReferenceBehavior); + } + return builder; + } +} + diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaAssemblyExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaAssemblyExtension.cs similarity index 93% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaAssemblyExtension.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaAssemblyExtension.cs index fb88229e..06353633 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaAssemblyExtension.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaAssemblyExtension.cs @@ -1,10 +1,10 @@ using Microsoft.CodeAnalysis; +using Natasha.DynamicLoad.Base; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Reflection.Metadata; -using System.Runtime.Loader; public static class NatashaAssemblyExtension @@ -28,7 +28,7 @@ public unsafe static IEnumerable GetDependencyReferences(this if (asmName != null) { var depAssembly = Assembly.Load(asmName); - if (depAssembly.TryGetRawMetadata(out var blob, out var length)) + if (NatashaLoadContext.Creator.TryGetRawMetadata(depAssembly, out var blob, out var length)) { if (filter == null || !filter(asmName, asmName.Name)) { @@ -221,22 +221,20 @@ public static T GetDelegateFromFullName(this Assembly assembly, string typeNa } - public static NatashaReferenceDomain GetDomain(this Assembly assembly) + public static INatashaDynamicLoadContextBase? GetDomain(this Assembly assembly) { - - var assemblyDomain = AssemblyLoadContext.GetLoadContext(assembly); - if (assemblyDomain == AssemblyLoadContext.Default) - { - return NatashaReferenceDomain.DefaultDomain!; - } - return (NatashaReferenceDomain)assemblyDomain!; + return NatashaLoadContext.Creator.GetDomain(assembly); } + public static void DisposeDomain(this Assembly assembly) { var domain = GetDomain(assembly); - if (domain.Name != "Default") + if (domain != null) { - domain.Dispose(); + if (domain.Name != NatashaLoadContext.DefaultName) + { + domain.Dispose(); + } } } } diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaDelegateExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaDelegateExtension.cs similarity index 66% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaDelegateExtension.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaDelegateExtension.cs index 58acaae5..705e9667 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaDelegateExtension.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaDelegateExtension.cs @@ -1,9 +1,10 @@ -using System; +using Natasha.DynamicLoad.Base; +using System; public static class NatashaDelegateExtension { - public static NatashaReferenceDomain GetDomain(this Delegate @delegate) + public static INatashaDynamicLoadContextBase? GetDomain(this Delegate @delegate) { return @delegate.Method.Module.Assembly.GetDomain(); diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaDiagnosticsExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaDiagnosticsExtension.cs similarity index 87% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaDiagnosticsExtension.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaDiagnosticsExtension.cs index cb79c03a..3752576b 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaDiagnosticsExtension.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaDiagnosticsExtension.cs @@ -1,5 +1,6 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; +using Natasha.DynamicLoad.Base; using System; using System.Collections.Generic; using System.Linq; @@ -36,7 +37,7 @@ public static void RemoveUsingAndNode(this UsingDirectiveSyntax usingDirectiveSy var name = usingDirectiveSyntax.Name; if (name!=null) { - NatashaReferenceDomain.DefaultDomain.UsingRecorder.Remove(name.ToString()); + NatashaLoadContext.DefaultContext.UsingRecorder.Remove(name.ToString()); } } @@ -51,12 +52,12 @@ public static void RemoveUsingAndNodesFromStartName(this Diagnostic diagnostic, select usingDeclaration).ToList(); removeCollection.UnionWith(usingNodes); - NatashaReferenceDomain.DefaultDomain.UsingRecorder.Remove(usingNodes.Select(item => item.Name!.ToString())); + NatashaLoadContext.DefaultContext.UsingRecorder.Remove(usingNodes.Select(item => item.Name!.ToString())); } } - public static NatashaReferenceDomain GetDomain(this Delegate @delegate) + public static INatashaDynamicLoadContextBase? GetDomain(this Delegate @delegate) { return @delegate.Method.Module.Assembly.GetDomain(); diff --git a/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaDomainExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaDomainExtension.cs new file mode 100644 index 00000000..9f7418f7 --- /dev/null +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaDomainExtension.cs @@ -0,0 +1,15 @@ +//using static System.Runtime.Loader.AssemblyLoadContext; +//public static class NatashaDomainExtension +//{ + +// /// +// /// 创建一个以该字符串命名的域并锁定 +// /// +// /// +// /// +// public static ContextualReflectionScope NatashaDomainScope(this string domain) +// { +// return DomainManagement.Create(domain).EnterContextualReflection(); +// } + +//} \ No newline at end of file diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaStringExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaStringExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaStringExtension.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaStringExtension.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaTypeExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaTypeExtension.cs similarity index 94% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaTypeExtension.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaTypeExtension.cs index 4bf9dfd9..2440d98e 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Extension/NatashaTypeExtension.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Extension/NatashaTypeExtension.cs @@ -1,4 +1,5 @@ using Microsoft.CodeAnalysis; +using Natasha.DynamicLoad.Base; using System; using System.Collections.Generic; using System.Reflection; @@ -46,7 +47,7 @@ public static T GetDelegateFromType(this Type type, string methodName, object return (T)GetDelegateFromType(type, methodName, typeof(T), target); } - public static NatashaReferenceDomain GetDomain(this Type type) + public static INatashaDynamicLoadContextBase? GetDomain(this Type type) { return type.Assembly.GetDomain(); diff --git a/src/Natasha.CSharp/Natasha.CSharp.Compiler/Natasha.CSharp.Compiler.csproj b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Natasha.CSharp.Compiler.csproj new file mode 100644 index 00000000..96536c60 --- /dev/null +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Natasha.CSharp.Compiler.csproj @@ -0,0 +1,30 @@ + + + + netstandard2.0; + Natasha 的 C# 版编译器 + DotNetCore.Natasha.CSharp.Compiler + 升级到最新版. + Roslyn;IL;Script;Dynamic;Natasha;NMS;Compiler; + true + 8.0.0.0 + 8.0.0.0 + 8.0.0.0 + + + + + + + + + + + + + + + + + + diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/NatashaAsssemblyHelper.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/NatashaAsssemblyHelper.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/NatashaAsssemblyHelper.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/NatashaAsssemblyHelper.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/NatashaInitializer.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/NatashaInitializer.cs similarity index 86% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/NatashaInitializer.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/NatashaInitializer.cs index 3662ade1..338e31f5 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/NatashaInitializer.cs +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/NatashaInitializer.cs @@ -1,5 +1,4 @@ using Microsoft.CodeAnalysis; -using Natasha.CSharp.Compiler.Public.Component.Metadata; using System; using System.Collections.Generic; using System.Diagnostics; @@ -9,13 +8,15 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using Natasha.CSharp.Compiler.Component; -public static class NatashaInitializer +internal static class NatashaInitializer { private static readonly object _lock = new(); private static bool _isCompleted = false; private static Func? _excludeReferencesFunc; + public static void Preheating(Func? excludeReferencesFunc = null , bool useRuntimeUsing = false , bool useRuntimeReference = false @@ -72,11 +73,6 @@ public static void Preheating(Func? excludeReferen #if DEBUG Stopwatch stopwatch = new(); stopwatch.Start(); -#endif - - //GlobalUsingHelper.SetDefaultUsingFilter(excludeReferencesFunc); - NatashaDomain.SetDefaultAssemblyFilter(excludeReferencesFunc); -#if DEBUG stopwatch.RestartAndShowCategoreInfo("[ Domain ]", "默认信息初始化", 1); #endif @@ -85,16 +81,14 @@ public static void Preheating(Func? excludeReferen stopwatch.RestartAndShowCategoreInfo("[ Assembly ]", "程序集扫描与加载", 1); #endif Queue parallelLoopResults = []; - parallelLoopResults.Enqueue(CacheRuntimeAssembly(assemblies)); - var namespaceCacheFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Natasha.Namespace.cache"); //不需要处理 using if(File.Exists(namespaceCacheFilePath) && useFileCache) { //从缓存文件中读取 using var namespaceCache = File.ReadAllText(namespaceCacheFilePath, Encoding.UTF8); - var namespaceText = namespaceCache.Split("+?", StringSplitOptions.RemoveEmptyEntries); - NatashaReferenceDomain.DefaultDomain.UsingRecorder.Using(namespaceText); + var namespaceText = namespaceCache.Split(["+?"], StringSplitOptions.RemoveEmptyEntries); + NatashaLoadContext.DefaultContext.UsingRecorder.Using(namespaceText); if (useRuntimeReference) { parallelLoopResults.Enqueue(InitReferenceFromRuntime(assemblies)); @@ -164,7 +158,7 @@ public static void Preheating(Func? excludeReferen Thread.Sleep(80); } } - NatashaReferenceDomain.DefaultDomain.UsingRecorder.ToString(); + NatashaLoadContext.DefaultContext.UsingRecorder.ToString(); #if DEBUG stopwatch.RestartAndShowCategoreInfo("[ Metadata ]", "编译缓存初始化", 1); #endif @@ -181,7 +175,7 @@ public static void Preheating(Func? excludeReferen if (!File.Exists(namespaceCacheFilePath) && useFileCache) { var namespaceCache = new StringBuilder(); - foreach (var preNamespace in NatashaReferenceDomain.DefaultDomain.UsingRecorder) + foreach (var preNamespace in NatashaLoadContext.DefaultContext.UsingRecorder) { namespaceCache.Append($"{preNamespace}+?"); } @@ -206,7 +200,7 @@ static ParallelLoopResult InitReferenceFromRuntime(Assembly[] assemblies) var result = MetadataHelper.GetMetadataFromMemory(assembly, _excludeReferencesFunc); if (result != null) { - NatashaReferenceDomain.DefaultDomain.References.AddReference(result.Value.asmName, result.Value.metadata, AssemblyCompareInfomation.None); + NatashaLoadContext.DefaultContext.References.AddReference(result.Value.asmName, result.Value.metadata, AssemblyCompareInfomation.None); } }); } @@ -217,7 +211,7 @@ static ParallelLoopResult InitReferenceAndUsingFromRuntime(Assembly[] assemblies var result = MetadataHelper.GetMetadataAndNamespaceFromMemory(assembly, _excludeReferencesFunc); if (result.HasValue) { - NatashaReferenceDomain.DefaultDomain.AddReferenceAndUsing(result.Value.asmName, result.Value.metadata, result.Value.namespaces); + NatashaLoadContext.DefaultContext.AddReferenceAndUsing(result.Value.asmName, result.Value.metadata, result.Value.namespaces); } }); } @@ -226,13 +220,9 @@ static ParallelLoopResult InitUsingFromRuntime(Assembly[] assemblies) return Parallel.ForEach(assemblies, assembly => { var namespaces = MetadataHelper.GetNamespaceFromMemroy(assembly, _excludeReferencesFunc); - NatashaReferenceDomain.DefaultDomain.UsingRecorder.Using(namespaces); + NatashaLoadContext.DefaultContext.UsingRecorder.Using(namespaces); }); } - static ParallelLoopResult CacheRuntimeAssembly(Assembly[] assemblies) - { - return Parallel.ForEach(assemblies, NatashaDomain.AddAssemblyToDefaultCache); - } unsafe static ParallelLoopResult InitUsingFromPath(IEnumerable paths) { return Parallel.ForEach(paths, (path) => @@ -240,7 +230,7 @@ unsafe static ParallelLoopResult InitUsingFromPath(IEnumerable paths) var result = MetadataHelper.GetNamespaceFromFile(path, _excludeReferencesFunc); if (result != null) { - NatashaReferenceDomain.DefaultDomain.UsingRecorder.Using(result); + NatashaLoadContext.DefaultContext.UsingRecorder.Using(result); } }); } @@ -251,7 +241,7 @@ unsafe static ParallelLoopResult InitReferenceFromPath(IEnumerable paths var result = MetadataHelper.GetMetadataFromFile(path, _excludeReferencesFunc); if (result != null) { - NatashaReferenceDomain.DefaultDomain.References.AddReference(result.Value.asmName, result.Value.metadata, AssemblyCompareInfomation.None); + NatashaLoadContext.DefaultContext.References.AddReference(result.Value.asmName, result.Value.metadata, AssemblyCompareInfomation.None); } }); } @@ -262,7 +252,7 @@ unsafe static ParallelLoopResult InitReferenceAndUsingFromPath(IEnumerable(Func? excludeReferencesFunc = null, + bool useRuntimeUsing = false, + bool useRuntimeReference = false, + bool useFileCache = false) where T : INatashaDynamicLoadContextCreator, new () + { + RegistDomainCreator(); + NatashaInitializer.Preheating(excludeReferencesFunc, useRuntimeUsing, useRuntimeReference, useFileCache); + } + + public static void Preheatingg( + bool useRuntimeUsing = false, + bool useRuntimeReference = false, + bool useFileCache = false) where T : INatashaDynamicLoadContextCreator, new() + { + RegistDomainCreator(); + NatashaInitializer.Preheating(null, useRuntimeUsing, useRuntimeReference, useFileCache); + } /// /// 和 NatashaInitializer.Preheating(); 一样 @@ -24,7 +42,10 @@ public static void Preheating( NatashaInitializer.Preheating(null, useRuntimeUsing, useRuntimeReference, useFileCache); } - + public static void RegistDomainCreator() where T : INatashaDynamicLoadContextCreator, new() + { + NatashaLoadContext.Prepare(); + } /// /// 增加全局 Using 引用,其他编译将默认添加该 Using @@ -33,7 +54,7 @@ public static void Preheating( /// public static void AddGlobalUsing(params string[] @namespaces) { - NatashaReferenceDomain.DefaultDomain.UsingRecorder.Using(@namespaces); + NatashaLoadContext.DefaultContext.UsingRecorder.Using(@namespaces); } /// @@ -45,7 +66,7 @@ public static void AddGlobalUsing(params Assembly[] @namespaces) { foreach (var item in @namespaces) { - NatashaReferenceDomain.DefaultDomain.UsingRecorder.Using(item); + NatashaLoadContext.DefaultContext.UsingRecorder.Using(item); } @@ -58,23 +79,23 @@ public static void AddGlobalUsing(params Assembly[] @namespaces) /// public static void RemoveGlobalUsing(params string[] @namespaces) { - NatashaReferenceDomain.DefaultDomain.UsingRecorder.Remove(@namespaces); + NatashaLoadContext.DefaultContext.UsingRecorder.Remove(@namespaces); } /// /// 获取系统域 /// /// - public static NatashaReferenceDomain GetDefaultDomain() + public static NatashaLoadContext GetDefaultDomain() { - return NatashaReferenceDomain.DefaultDomain; + return NatashaLoadContext.DefaultContext; } /// /// 新建一个域 /// /// /// - public static NatashaReferenceDomain CreateDomain(string domainName) + public static NatashaLoadContext CreateDomain(string domainName) { return DomainManagement.Create(domainName); } @@ -82,7 +103,7 @@ public static NatashaReferenceDomain CreateDomain(string domainName) /// 新建一个随机域 /// /// - public static NatashaReferenceDomain CreateRandomDomain() + public static NatashaLoadContext CreateRandomDomain() { return DomainManagement.Random(); } @@ -108,7 +129,7 @@ public static bool AddGlobalReferenceAndUsing(Assembly assembly, AssemblyCompare var result = MetadataHelper.GetMetadataAndNamespaceFromMemory(assembly); if (result != null) { - NatashaReferenceDomain.DefaultDomain.AddReferenceAndUsing(result.Value.asmName, result.Value.metadata, result.Value.namespaces, loadBehavior); + NatashaLoadContext.DefaultContext.AddReferenceAndUsing(result.Value.asmName, result.Value.metadata, result.Value.namespaces, loadBehavior); return true; } return false; @@ -124,7 +145,7 @@ public static bool AddGlobalReferenceAndUsing(string filePath, AssemblyCompareIn var result = MetadataHelper.GetMetadataAndNamespaceFromFile(filePath); if (result != null) { - NatashaReferenceDomain.DefaultDomain.AddReferenceAndUsing(result.Value.asmName, result.Value.metadata, result.Value.namespaces, loadBehavior); + NatashaLoadContext.DefaultContext.AddReferenceAndUsing(result.Value.asmName, result.Value.metadata, result.Value.namespaces, loadBehavior); return true; } return false; @@ -142,7 +163,7 @@ public static bool RemoveGlobalReference(Type type, AssemblyCompareInfomation lo { return false; } - NatashaReferenceDomain.DefaultDomain.References.RemoveReference(type.Assembly.GetName()); + NatashaLoadContext.DefaultContext.References.RemoveReference(type.Assembly.GetName()); return true; } } diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Reverser/AvailableNameReverser.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Reverser/AvailableNameReverser.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Reverser/AvailableNameReverser.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Reverser/AvailableNameReverser.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Reverser/TypeNameReverser.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Reverser/TypeNameReverser.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Reverser/TypeNameReverser.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Reverser/TypeNameReverser.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Reverser/TypeNatashaExtension.cs b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Reverser/TypeNatashaExtension.cs similarity index 100% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Reverser/TypeNatashaExtension.cs rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Reverser/TypeNatashaExtension.cs diff --git a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Targets/Project.Usings.targets b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Targets/Project.Usings.targets similarity index 73% rename from src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Targets/Project.Usings.targets rename to src/Natasha.CSharp/Natasha.CSharp.Compiler/Targets/Project.Usings.targets index 7c15b178..a5765654 100644 --- a/src/Natasha.CSharp/Core/Natasha.CSharp.Compiler/Targets/Project.Usings.targets +++ b/src/Natasha.CSharp/Natasha.CSharp.Compiler/Targets/Project.Usings.targets @@ -2,8 +2,7 @@ + - - \ No newline at end of file diff --git a/src/Natasha.CSharp/Natasha.DynamicLoad.Base/INatashaDynamicLoadContextBase.cs b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/INatashaDynamicLoadContextBase.cs new file mode 100644 index 00000000..01c0f06b --- /dev/null +++ b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/INatashaDynamicLoadContextBase.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System; + +namespace Natasha.DynamicLoad.Base +{ + public interface INatashaDynamicLoadContextBase : IDisposable + { + string? Name { get; } + + object? GetCallerReference(); + + void SetCallerReference(object instance); + + Assembly LoadPlugin(string path, Func? excludeAssembliesFunc = null); + + void SetAssemblyLoadBehavior(AssemblyCompareInfomation loadBehavior); + + IEnumerable Assemblies { get; } + + Assembly LoadAssemblyFromFile(string path); + + Assembly LoadAssemblyFromStream(Stream dllStream, Stream? pdbStream); + } +} \ No newline at end of file diff --git a/src/Natasha.CSharp/Natasha.DynamicLoad.Base/INatashaDynamicLoadContextCreator.cs b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/INatashaDynamicLoadContextCreator.cs new file mode 100644 index 00000000..e3f5ddcf --- /dev/null +++ b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/INatashaDynamicLoadContextCreator.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using System.Reflection; +namespace Natasha.DynamicLoad.Base +{ + public interface INatashaDynamicLoadContextCreator + { + INatashaDynamicLoadContextBase CreateContext(string key); + + INatashaDynamicLoadContextBase CreateDefaultContext(); + INatashaDynamicLoadContextBase? GetDomain(Assembly assembly); + unsafe bool TryGetRawMetadata(Assembly assembly, out byte* blob, out int length); + IEnumerable? GetDependencyAssemblies(Assembly assembly); + } +} \ No newline at end of file diff --git a/src/Natasha.CSharp/Core/Natasha.Domain/Core/Model/PluginLoadBehavior.cs b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/Model/AssemblyCompareInfomation.cs similarity index 97% rename from src/Natasha.CSharp/Core/Natasha.Domain/Core/Model/PluginLoadBehavior.cs rename to src/Natasha.CSharp/Natasha.DynamicLoad.Base/Model/AssemblyCompareInfomation.cs index 664da2ca..fdcc35b6 100644 --- a/src/Natasha.CSharp/Core/Natasha.Domain/Core/Model/PluginLoadBehavior.cs +++ b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/Model/AssemblyCompareInfomation.cs @@ -6,5 +6,4 @@ UseDefault, UseCustom, UseForce -} - +} \ No newline at end of file diff --git a/src/Natasha.CSharp/Core/Natasha.Domain/Core/Model/AssemblyLoadVersionResult.cs b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/Model/AssemblyLoadVersionResult.cs similarity index 90% rename from src/Natasha.CSharp/Core/Natasha.Domain/Core/Model/AssemblyLoadVersionResult.cs rename to src/Natasha.CSharp/Natasha.DynamicLoad.Base/Model/AssemblyLoadVersionResult.cs index d6dc5f2a..a3e79b84 100644 --- a/src/Natasha.CSharp/Core/Natasha.Domain/Core/Model/AssemblyLoadVersionResult.cs +++ b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/Model/AssemblyLoadVersionResult.cs @@ -1,4 +1,4 @@ -namespace Natasha.CSharp.Component.Domain +namespace Natasha.CSharp.Component.Load { public enum AssemblyLoadVersionResult { @@ -19,4 +19,4 @@ public enum AssemblyLoadVersionResult /// PassToNextHandler } -} +} \ No newline at end of file diff --git a/src/Natasha.CSharp/Core/Natasha.Domain/Extension/Inner/AssemblyNameExtension.cs b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/Model/AssemblyNameExtension.cs similarity index 95% rename from src/Natasha.CSharp/Core/Natasha.Domain/Extension/Inner/AssemblyNameExtension.cs rename to src/Natasha.CSharp/Natasha.DynamicLoad.Base/Model/AssemblyNameExtension.cs index b60dce6b..de2caf6b 100644 --- a/src/Natasha.CSharp/Core/Natasha.Domain/Extension/Inner/AssemblyNameExtension.cs +++ b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/Model/AssemblyNameExtension.cs @@ -1,7 +1,6 @@ -using Natasha.CSharp.Component.Domain; -using System.Reflection; +using Natasha.CSharp.Component.Load; -namespace Natasha.Domain.Extension +namespace System.Reflection { public static class AssemblyNameExtension { diff --git a/src/Natasha.CSharp/Natasha.DynamicLoad.Base/Natasha.DynamicLoad.Base.csproj b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/Natasha.DynamicLoad.Base.csproj new file mode 100644 index 00000000..e758dc92 --- /dev/null +++ b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/Natasha.DynamicLoad.Base.csproj @@ -0,0 +1,21 @@ + + + + netstandard2.0 + true + Natasha 域加载上下文的接口规范. + DotNetCore.Natasha.DynamicLoad.Base + 升级到最新版. + Natasha;Compiler;LoadContext;Interface; + true + 8.0.0.0 + 8.0.0.0 + 8.0.0.0 + + + + + + + + diff --git a/src/Natasha.CSharp/Core/Natasha.Domain/Targets/project.usings.targets b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/Targets/Project.Usings.targets similarity index 55% rename from src/Natasha.CSharp/Core/Natasha.Domain/Targets/project.usings.targets rename to src/Natasha.CSharp/Natasha.DynamicLoad.Base/Targets/Project.Usings.targets index 64a6a347..834a370b 100644 --- a/src/Natasha.CSharp/Core/Natasha.Domain/Targets/project.usings.targets +++ b/src/Natasha.CSharp/Natasha.DynamicLoad.Base/Targets/Project.Usings.targets @@ -1,6 +1,6 @@ - - + + \ No newline at end of file diff --git a/test/ut/NatashaFunctionUT/Compile/CompileInSameDomainTest.cs b/test/ut/NatashaFunctionUT/Compile/CompileInSameDomainTest.cs index 9e081236..9dc2abe7 100644 --- a/test/ut/NatashaFunctionUT/Compile/CompileInSameDomainTest.cs +++ b/test/ut/NatashaFunctionUT/Compile/CompileInSameDomainTest.cs @@ -8,37 +8,34 @@ namespace NatashaFunctionUT.Compile { [Trait("基础功能测试", "编译")] - public class CompileInSameDomainTest : DomainPrepare + public class CompileInSameDomainTest : CompilerPrepareBase { [Fact(DisplayName = "[不同命名空间][不同程序集]同域编译")] public void DNDASDCompile() { - using (DomainManagement.Random().CreateScope()) + + var loadContext = DomainManagement.Random(); + var referenceCount = DomainManagement.Random().References.Count; + + + AssemblyCSharpBuilder builder = new() { - var domainName = DomainManagement.CurrentDomain.Name; - var referenceCount = DomainManagement.CurrentDomain.References.Count; - Assert.NotEqual("Default", domainName); - - - AssemblyCSharpBuilder builder = new() - { - AssemblyName = "ASDASD1" - }; - builder.UseSmartMode(); - Assert.NotEqual("Default", builder.Domain.Name); - builder.WithCombineUsingCode(UsingLoadBehavior.WithCurrent); - builder.Add("namespace TestA{ public class A { public string Name = \"Hello\"; }}"); - var assemblyA = builder.GetAssembly(); - Assert.NotNull(assemblyA); - Assert.True(builder.Domain.UsingRecorder.HasUsing("TestA")); - Assert.Equal(domainName, DomainManagement.CurrentDomain.Name); + AssemblyName = "ASDASD1", + LoadContext = loadContext + }; + builder.UseSmartMode(); + Assert.NotEqual("Default", builder.Domain.Name); - builder.Clear(); + builder.Add("namespace TestA{ public class A { public string Name = \"Hello\"; }}"); + var assemblyA = builder.GetAssembly(); + Assert.NotNull(assemblyA); + Assert.True(builder.LoadContext.UsingRecorder.HasUsing("TestA")); - builder.AssemblyName = "ASDASD2"; - Assert.Equal(domainName, DomainManagement.CurrentDomain.Name); - Assert.Equal(referenceCount, DomainManagement.CurrentDomain.References.Count - 1); - builder.Add(@"namespace TestB + builder.Clear(); + + builder.AssemblyName = "ASDASD2"; + Assert.Equal(referenceCount, loadContext.References.Count - 1); + builder.Add(@"namespace TestB { public class B { @@ -48,65 +45,61 @@ public B(){ public string Name; } }"); - - var assemblyB = builder.GetAssembly(); - Assert.True(builder.Domain.UsingRecorder.HasUsing("TestB")); - Assert.NotNull(assemblyB); - Thread.Sleep(2000); - builder.Clear(); - builder.AssemblyName = "ASDASD3"; - Assert.Equal(domainName, DomainManagement.CurrentDomain.Name); - Assert.Equal(referenceCount, DomainManagement.CurrentDomain.References.Count - 2); - builder.Add("public class C { public static string Show(){ return (new A()).Name+(new B()).Name; } }"); - var assemblyC = builder.GetAssembly(); - var type = assemblyC.GetTypes().Where(item => item.Name == "C").First(); - var methodInfo = type.GetMethod("Show"); - var result = (string)methodInfo!.Invoke(null,null)!; - Assert.Equal(domainName, DomainManagement.CurrentDomain.Name); - Assert.Equal("Hello World!", result); + var assemblyB = builder.GetAssembly(); + builder.WithCombineUsingCode(UsingLoadBehavior.WithCurrent); + Assert.True(builder.LoadContext.UsingRecorder.HasUsing("TestB")); + Assert.NotNull(assemblyB); - } + Thread.Sleep(2000); + builder.Clear(); + builder.AssemblyName = "ASDASD3"; + Assert.Equal(referenceCount, loadContext.References.Count - 2); + builder.Add("public class C { public static string Show(){ return (new A()).Name+(new B()).Name; } }"); + var assemblyC = builder.GetAssembly(); + var type = assemblyC.GetTypes().Where(item => item.Name == "C").First(); + var methodInfo = type.GetMethod("Show"); + var result = (string)methodInfo!.Invoke(null, null)!; + Assert.Equal("Hello World!", result); } [Fact(DisplayName = "[不同域]编译引用对比")] public void DDReferenceCompile() { - using (DomainManagement.Create("DiffDomainReferenceCompare1").CreateScope()) - { - Assert.NotEqual("Default", DomainManagement.CurrentDomain.Name); - AssemblyCSharpBuilder builder1 = new(); - builder1.UseSmartMode(); - builder1.WithCombineUsingCode(UsingLoadBehavior.WithDefault); - builder1.Add( "namespace TestA{ public class A { public string Name = \"Hello\"; public static NatashaUsingCache Get(){ return null;} }}"); - var assemblyA = builder1 - .WithCombineReferences(item=>item.UseDefaultReferences()) - .GetAssembly(); - var typeA = assemblyA.GetTypes().Where(item => item.Name == "A").First(); - var objA = Activator.CreateInstance(typeA); - Assert.NotNull(assemblyA); - Assert.True(builder1.Domain.UsingRecorder.HasUsing("TestA")); + AssemblyCSharpBuilder builder1 = new() + { + LoadContext = DomainManagement.Create("DiffDomainReferenceCompare1") + }; + builder1.UseSmartMode(); + builder1.WithCombineUsingCode(UsingLoadBehavior.WithDefault); + builder1.Add("namespace TestA{ public class A { public string Name = \"Hello\"; public static NatashaUsingCache Get(){ return null;} }}"); + var assemblyA = builder1 + .WithCombineReferences(item => item.UseDefaultReferences()) + .GetAssembly(); + var typeA = assemblyA.GetTypes().Where(item => item.Name == "A").First(); + var objA = Activator.CreateInstance(typeA); + Assert.NotNull(assemblyA); + Assert.True(builder1.LoadContext.UsingRecorder.HasUsing("TestA")); - } - using (DomainManagement.Create("DiffDomainReferenceCompare2").CreateScope()) + AssemblyCSharpBuilder builder2 = new() { - AssemblyCSharpBuilder builder2 = new(); - builder2.WithCombineUsingCode(UsingLoadBehavior.WithDefault); - builder2.Add("namespace TestB{ public class A { public string Name = \"Hello\"; public static NatashaUsingCache Get(){ return null;} }}"); - var assemblyB = builder2 - .WithCombineReferences() - .GetAssembly(); - var typeB = assemblyB.GetTypes().Where(item => item.Name == "A").First(); - var objB = Activator.CreateInstance(typeB); - Assert.NotNull(assemblyB); - Assert.True(builder2.Domain.UsingRecorder.HasUsing("TestB")); - } + LoadContext = DomainManagement.Create("DiffDomainReferenceCompare2") + }; + builder2.WithCombineUsingCode(UsingLoadBehavior.WithDefault); + builder2.Add("namespace TestB{ public class A { public string Name = \"Hello\"; public static NatashaUsingCache Get(){ return null;} }}"); + var assemblyB = builder2 + .WithCombineReferences() + .GetAssembly(); + var typeB = assemblyB.GetTypes().Where(item => item.Name == "A").First(); + var objB = Activator.CreateInstance(typeB); + Assert.NotNull(assemblyB); + Assert.True(builder2.LoadContext.UsingRecorder.HasUsing("TestB")); var domain1 = DomainManagement.Get("DiffDomainReferenceCompare1")!; var domain2 = DomainManagement.Get("DiffDomainReferenceCompare2")!; - Assert.True(domain1.Assemblies.Any()); - Assert.Equal(domain1.Assemblies.Count(), domain2.Assemblies.Count()); + Assert.True(domain1.Domain.Assemblies.Any()); + Assert.Equal(domain1.Domain.Assemblies.Count(), domain2.Domain.Assemblies.Count()); Assert.True(domain1.References.Count == domain2.References.Count); } } diff --git a/test/ut/NatashaFunctionUT/Compile/CompileLogTest.cs b/test/ut/NatashaFunctionUT/Compile/CompileLogTest.cs index 8d840924..4cb5e685 100644 --- a/test/ut/NatashaFunctionUT/Compile/CompileLogTest.cs +++ b/test/ut/NatashaFunctionUT/Compile/CompileLogTest.cs @@ -6,7 +6,7 @@ namespace NatashaFunctionUT.Compile { [Trait("基础功能测试", "编译")] - public class CompileLogTest : DomainPrepare + public class CompileLogTest : CompilerPrepareBase { [Fact(DisplayName = "错误日志1")] public void CompareErrorLog1() @@ -21,6 +21,8 @@ public void Show(){ try { AssemblyCSharpBuilder builder = new("ee79d3e2b027491f93705a4098568bc8"); + builder.UseRandomDomain(); + builder.WithCombineReferences(item=>item.UseDefaultReferences()); builder.WithoutCombineUsingCode(); builder.Add(code); builder.CompileFailedEvent += (compilation, errors) => @@ -75,6 +77,7 @@ public class A{ { AssemblyCSharpBuilder builder = new("ee79d3e2b027491f93705a4098578bcc"); builder + .UseRandomDomain() .UseSmartMode() .WithoutCombineUsingCode(); builder.Add(code); @@ -113,7 +116,7 @@ public int Get(){ try { AssemblyCSharpBuilder builder = new("ed79d3e2b027491f93705a4098578bcd"); - builder.WithoutCombineUsingCode(); + builder.UseRandomDomain().WithCombineReferences(item=>item.UseDefaultReferences()).WithoutCombineUsingCode(); builder.Add(code1); builder.Add(code2); builder.ConfigCompilerOption(opt => opt.WithNullableCompile(Microsoft.CodeAnalysis.NullableContextOptions.Disable)); @@ -148,8 +151,10 @@ public int Get(){ } }"; NatashaCompilationLog? log = null; - AssemblyCSharpBuilder builder = new("2d79d3e2b027491f93705a4098578bcd"); - builder.Domain = DomainManagement.Random(); + AssemblyCSharpBuilder builder = new("2d79d3e2b027491f93705a4098578bcd") + { + LoadContext = DomainManagement.Random() + }; builder.UseSmartMode(); builder.WithoutCombineUsingCode(); builder.ConfigCompilerOption(opt => opt.WithNullableCompile(Microsoft.CodeAnalysis.NullableContextOptions.Disable)); diff --git a/test/ut/NatashaFunctionUT/Compile/CompileSemanticTest.cs b/test/ut/NatashaFunctionUT/Compile/CompileSemanticTest.cs index 4caaca3e..a2a61ffc 100644 --- a/test/ut/NatashaFunctionUT/Compile/CompileSemanticTest.cs +++ b/test/ut/NatashaFunctionUT/Compile/CompileSemanticTest.cs @@ -5,15 +5,17 @@ namespace NatashaFunctionUT.Compile { [Trait("基础功能测试", "编译")] - public class CompileSemanticTest : DomainPrepare + public class CompileSemanticTest : CompilerPrepareBase { [Fact(DisplayName = "[语义过滤]编译测试")] public void SemanticTest1() { - var code = NatashaReferenceDomain.DefaultDomain.UsingRecorder.ToString() + "using abcde;public class A{ public string Name;}"; - AssemblyCSharpBuilder builder = new(); - builder.Domain = DomainManagement.Random(); + var code = NatashaLoadContext.DefaultContext.UsingRecorder.ToString() + "using abcde;public class A{ public string Name;}"; + AssemblyCSharpBuilder builder = new() + { + LoadContext = DomainManagement.Random() + }; builder.UseSmartMode(); builder.EnableSemanticHandler = false; builder.Add(code); diff --git a/test/ut/NatashaFunctionUT/Compile/CompileUnitTest.cs b/test/ut/NatashaFunctionUT/Compile/CompileUnitTest.cs index 99b8ce58..6bccddbf 100644 --- a/test/ut/NatashaFunctionUT/Compile/CompileUnitTest.cs +++ b/test/ut/NatashaFunctionUT/Compile/CompileUnitTest.cs @@ -7,52 +7,49 @@ namespace NatashaFunctionUT.Compile { [Trait("基础功能测试", "编译")] - public class CompileUnitTest : DomainPrepare + public class CompileUnitTest : CompilerPrepareBase { [Fact(DisplayName = "基础编译测试 - 程序集")] public void TestAssembly() { string code = @"public class A{public string Name=""HelloWorld"";}"; - using (DomainManagement.Random().CreateScope()) - { - AssemblyCSharpBuilder builder = new(); - builder.UseSmartMode(); - builder.Add(code); - var assembly = builder.GetAssembly(); - Assert.NotNull(assembly); + AssemblyCSharpBuilder builder = new(); + builder.UseRandomDomain(); + builder.UseSmartMode(); + builder.Add(code); - var type = assembly.GetTypes().Where(item => item.Name == "A").First(); - var info = type.GetField("Name"); + var assembly = builder.GetAssembly(); + Assert.NotNull(assembly); - Assert.Equal("HelloWorld", info!.GetValue(Activator.CreateInstance(type))); - Assert.NotEqual("Default", builder.Domain.Name); + var type = assembly.GetTypes().Where(item => item.Name == "A").First(); + var info = type.GetField("Name"); + + Assert.Equal("HelloWorld", info!.GetValue(Activator.CreateInstance(type))); + Assert.NotEqual("Default", builder.Domain.Name); - } } [Fact(DisplayName = "基础编译测试 - 类型")] public void TestType() { string code = @"public class A{public string Name=""HelloWorld"";}"; - using (DomainManagement.Random().CreateScope()) - { - AssemblyCSharpBuilder builder = new(); - builder.UseSmartMode(); - builder.Add(code); - var assembly = builder.GetAssembly(); - var type = assembly.GetTypeFromShortName("A"); - Assert.Equal("A", type.Name); + AssemblyCSharpBuilder builder = new(); + builder.UseRandomDomain(); + builder.UseSmartMode(); + builder.Add(code); + + var assembly = builder.GetAssembly(); + var type = assembly.GetTypeFromShortName("A"); + Assert.Equal("A", type.Name); - var info = type.GetField("Name"); - Assert.Equal("HelloWorld", info!.GetValue(Activator.CreateInstance(type))); + var info = type.GetField("Name"); + Assert.Equal("HelloWorld", info!.GetValue(Activator.CreateInstance(type))); - Assert.NotEqual("Default", builder.Domain.Name); - - } + Assert.NotEqual("Default", builder.Domain.Name); } @@ -60,19 +57,17 @@ public void TestType() public void TestDelegate() { string code = @"public class A{public string Name=""HelloWorld""; public static string Get(){ return (new A()).Name; }}"; - using (DomainManagement.Create("compileUntiTestFoDelegate").CreateScope()) - { - AssemblyCSharpBuilder builder = new("compileUntiTestFoDelegateAssembly"); - builder.UseSmartMode(); - builder.Add(code); - - var assembly = builder.GetAssembly(); - var func = assembly.GetDelegateFromShortName>("A","Get"); - Assert.Equal("compileUntiTestFoDelegateAssembly", func.Method.Module.Assembly.GetName().Name!); - Assert.Equal("HelloWorld", func()); - Assert.Equal("compileUntiTestFoDelegate", builder.Domain.Name); - - } + + AssemblyCSharpBuilder builder = new("compileUntiTestFoDelegateAssembly"); + builder.UseNewDomain("compileUntiTestFoDelegate"); + builder.UseSmartMode(); + builder.Add(code); + + var assembly = builder.GetAssembly(); + var func = assembly.GetDelegateFromShortName>("A", "Get"); + Assert.Equal("compileUntiTestFoDelegateAssembly", func.Method.Module.Assembly.GetName().Name!); + Assert.Equal("HelloWorld", func()); + Assert.Equal("compileUntiTestFoDelegate", builder.Domain.Name); } } diff --git a/test/ut/NatashaFunctionUT/CompilerPrepareBase.cs b/test/ut/NatashaFunctionUT/CompilerPrepareBase.cs new file mode 100644 index 00000000..b8f2ddc9 --- /dev/null +++ b/test/ut/NatashaFunctionUT/CompilerPrepareBase.cs @@ -0,0 +1,30 @@ +using System; +using System.Linq; +using System.Runtime.Loader; + +namespace NatashaFunctionUT +{ + public class CompilerPrepareBase + { + protected static readonly int DefaultAssembliesCount; + protected static readonly int DefaultUsingCount; + protected static string _runtimeVersion; + static CompilerPrepareBase() + { + + NatashaManagement.RegistDomainCreator(); +#if NETCOREAPP3_1 + _runtimeVersion = "netcoreapp3.1"; +#elif NET5_0 + _runtimeVersion = "net5.0"; +#elif NET6_0 + _runtimeVersion = "net6.0"; +#elif NET8_0 + _runtimeVersion = "net8.0"; +#endif + DefaultAssembliesCount = AssemblyLoadContext.Default.Assemblies.Count(); + NatashaInitializer.Preheating((item, name) => name!.Contains("IO"), true, false); + DefaultUsingCount = NatashaLoadContext.DefaultContext.UsingRecorder.Count; + } + } +} diff --git a/test/ut/NatashaFunctionUT/DomainPrepare.cs b/test/ut/NatashaFunctionUT/DomainPrepare.cs deleted file mode 100644 index 06d12f6a..00000000 --- a/test/ut/NatashaFunctionUT/DomainPrepare.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Microsoft.CodeAnalysis; -using System.Linq; -using System.Runtime.Loader; - - -public class DomainPrepare -{ - - protected static readonly int DefaultAssembliesCount; - protected static readonly int DefaultUsingCount; - protected static string _runtimeVersion; - static DomainPrepare() - { - -#if NETCOREAPP3_1 - _runtimeVersion = "netcoreapp3.1"; -#elif NET5_0 - _runtimeVersion = "net5.0"; -#elif NET6_0 - _runtimeVersion = "net6.0"; -#elif NET8_0 - _runtimeVersion = "net8.0"; -#endif - DefaultAssembliesCount = AssemblyLoadContext.Default.Assemblies.Count(); - NatashaInitializer.Preheating((item, name) => name!.Contains("IO"), true, false); - DefaultUsingCount = NatashaReferenceDomain.DefaultDomain.UsingRecorder.Count; - } - - public AssemblyCSharpBuilder GetRandomAssemblyBuilder() - { - return new AssemblyCSharpBuilder().UseRandomDomain().UseSmartMode(); - } - -} - diff --git a/test/ut/NatashaFunctionUT/DomainPrepareBase.cs b/test/ut/NatashaFunctionUT/DomainPrepareBase.cs new file mode 100644 index 00000000..90838765 --- /dev/null +++ b/test/ut/NatashaFunctionUT/DomainPrepareBase.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NatashaFunctionUT +{ + public class DomainPrepareBase + { + static DomainPrepareBase() + { + NatashaManagement.RegistDomainCreator(); + } + } +} diff --git a/test/ut/NatashaFunctionUT/NatashaFunctionUT.csproj b/test/ut/NatashaFunctionUT/NatashaFunctionUT.csproj index 77957008..39dd6698 100644 --- a/test/ut/NatashaFunctionUT/NatashaFunctionUT.csproj +++ b/test/ut/NatashaFunctionUT/NatashaFunctionUT.csproj @@ -15,6 +15,7 @@ + @@ -32,12 +33,11 @@ - - + + - Always diff --git a/test/ut/NatashaFunctionUT/Special/DeconstructTest.cs b/test/ut/NatashaFunctionUT/Special/DeconstructTest.cs index e6b5241e..32b556ff 100644 --- a/test/ut/NatashaFunctionUT/Special/DeconstructTest.cs +++ b/test/ut/NatashaFunctionUT/Special/DeconstructTest.cs @@ -12,7 +12,7 @@ public void Test() using (DomainManagement.Random().CreateScope()) { - (var assembly, var log) = "public class A{ public A(){ Age = 1;} public int Age; }"; + (var assembly, var log) = "public class AH4H4H{ public AH4H4H(){ Age = 1;} public int Age; }"; Assert.NotNull(assembly); Assert.False(log.HasError); diff --git a/test/ut/NatashaFunctionUT/Special/Private/PrivateTest.cs b/test/ut/NatashaFunctionUT/Special/Private/PrivateTest.cs index 9c96cb19..042c300b 100644 --- a/test/ut/NatashaFunctionUT/Special/Private/PrivateTest.cs +++ b/test/ut/NatashaFunctionUT/Special/Private/PrivateTest.cs @@ -5,7 +5,7 @@ namespace NatashaFunctionUT.Special { [Trait("高级API功能测试", "其他")] - public class PrivateTest : DomainPrepare + public class PrivateTest : CompilerPrepareBase { [Fact(DisplayName = "私有成员调用")] @@ -32,7 +32,7 @@ public void Test() public void Test1() { - PrivateMemberClassModel test = new PrivateMemberClassModel(); + PrivateMemberClassModel test = new(); var action = NDelegate .RandomDomain(builder => builder.UseSmartMode().ConfigCompilerOption(opt => opt .WithAllMetadata() @@ -46,7 +46,7 @@ public void Test1() [Fact(DisplayName = "私有成员调用3")] public void Test2() { - PrivateMemberClassModel test = new PrivateMemberClassModel(); + PrivateMemberClassModel test = new(); var action = NDelegate .RandomDomain(builder => { diff --git a/test/ut/NatashaFunctionUT/Special/Readonly/ReadonlyTest.cs b/test/ut/NatashaFunctionUT/Special/Readonly/ReadonlyTest.cs index f6ccfd7e..12f2ec3f 100644 --- a/test/ut/NatashaFunctionUT/Special/Readonly/ReadonlyTest.cs +++ b/test/ut/NatashaFunctionUT/Special/Readonly/ReadonlyTest.cs @@ -5,7 +5,7 @@ namespace NatashaFunctionUT.Special { [Trait("高级API功能测试", "其他")] - public class ReadonlyTest : DomainPrepare + public class ReadonlyTest : CompilerPrepareBase { [Fact(DisplayName = "私有只读成员动态赋值")] diff --git a/test/ut/NatashaFunctionUT/Syntax/ParseTest.cs b/test/ut/NatashaFunctionUT/Syntax/ParseTest.cs index 917cc4ba..ac8633bc 100644 --- a/test/ut/NatashaFunctionUT/Syntax/ParseTest.cs +++ b/test/ut/NatashaFunctionUT/Syntax/ParseTest.cs @@ -4,7 +4,7 @@ namespace NatashaFunctionUT.Syntax { [Trait("基础功能测试", "语法")] - public class ParseTest + public class ParseTest : DomainPrepareBase { private NatashaException? CatchTreeError(string code) { diff --git a/test/ut/NatashaFunctionUT/Syntax/SyntaxOopNameTest.cs b/test/ut/NatashaFunctionUT/Syntax/SyntaxOopNameTest.cs index dcdbe45b..10577e05 100644 --- a/test/ut/NatashaFunctionUT/Syntax/SyntaxOopNameTest.cs +++ b/test/ut/NatashaFunctionUT/Syntax/SyntaxOopNameTest.cs @@ -5,7 +5,7 @@ namespace NatashaFunctionUT.Syntax { [Trait("基础功能测试", "语法")] - public class SyntaxOopNameTest + public class SyntaxOopNameTest : DomainPrepareBase { [Fact(DisplayName = "获取存储结构名")] public void GetOOPName1() diff --git a/test/ut/NatashaFunctionUT/Template/Compile/ClassBuilderTest.cs b/test/ut/NatashaFunctionUT/Template/Compile/ClassBuilderTest.cs index 98fa8b08..ee8211c8 100644 --- a/test/ut/NatashaFunctionUT/Template/Compile/ClassBuilderTest.cs +++ b/test/ut/NatashaFunctionUT/Template/Compile/ClassBuilderTest.cs @@ -9,7 +9,7 @@ namespace NatashaFunctionUT.Template.Compile { [Trait("高级API功能测试", "OOP")] - public class ClassBuilderTest : DomainPrepare + public class ClassBuilderTest : CompilerPrepareBase { [Fact(DisplayName = "类构建与编译1")] public void TestClass() diff --git a/test/ut/NatashaFunctionUT/Template/Compile/EnumBuilderTest.cs b/test/ut/NatashaFunctionUT/Template/Compile/EnumBuilderTest.cs index 14371f8e..1f21867a 100644 --- a/test/ut/NatashaFunctionUT/Template/Compile/EnumBuilderTest.cs +++ b/test/ut/NatashaFunctionUT/Template/Compile/EnumBuilderTest.cs @@ -5,7 +5,7 @@ namespace NatashaFunctionUT.Template.Compile { [Trait("高级API功能测试", "OOP")] - public class EnumBuilderTest : DomainPrepare + public class EnumBuilderTest : CompilerPrepareBase { [Fact(DisplayName = "枚举构建与编译1")] diff --git a/test/ut/NatashaFunctionUT/Template/Compile/FakeOperatorTest.cs b/test/ut/NatashaFunctionUT/Template/Compile/FakeOperatorTest.cs index acf85274..de7b0042 100644 --- a/test/ut/NatashaFunctionUT/Template/Compile/FakeOperatorTest.cs +++ b/test/ut/NatashaFunctionUT/Template/Compile/FakeOperatorTest.cs @@ -6,7 +6,7 @@ namespace NatashaFunctionUT.Template.Compile { [Trait("高级API功能测试", "模板")] - public class FakeOperatorTest : DomainPrepare + public class FakeOperatorTest : CompilerPrepareBase { [Fact(DisplayName = "普通函数克隆")] diff --git a/test/ut/NatashaFunctionUT/Template/Compile/FastOperatorTest.cs b/test/ut/NatashaFunctionUT/Template/Compile/FastOperatorTest.cs index f8191189..d23cf23e 100644 --- a/test/ut/NatashaFunctionUT/Template/Compile/FastOperatorTest.cs +++ b/test/ut/NatashaFunctionUT/Template/Compile/FastOperatorTest.cs @@ -7,7 +7,7 @@ namespace NatashaFunctionUT.Template.Compile { [Trait("高级API功能测试", "模板")] - public class FastOperatorTest : DomainPrepare + public class FastOperatorTest : CompilerPrepareBase { [Fact(DisplayName = "委托构建1")] diff --git a/test/ut/NatashaFunctionUT/Template/Compile/InterfaceBuilderTest.cs b/test/ut/NatashaFunctionUT/Template/Compile/InterfaceBuilderTest.cs index d1121fe8..230f6c07 100644 --- a/test/ut/NatashaFunctionUT/Template/Compile/InterfaceBuilderTest.cs +++ b/test/ut/NatashaFunctionUT/Template/Compile/InterfaceBuilderTest.cs @@ -5,7 +5,7 @@ namespace NatashaFunctionUT.Template.Compile { [Trait("高级API功能测试", "OOP")] - public class InterfaceBuilderTest : DomainPrepare + public class InterfaceBuilderTest : CompilerPrepareBase { [Fact(DisplayName = "接口构建与编译")] diff --git a/test/ut/NatashaFunctionUT/Template/Compile/NDelegateTest.cs b/test/ut/NatashaFunctionUT/Template/Compile/NDelegateTest.cs index 52b799b0..7bfd79dc 100644 --- a/test/ut/NatashaFunctionUT/Template/Compile/NDelegateTest.cs +++ b/test/ut/NatashaFunctionUT/Template/Compile/NDelegateTest.cs @@ -5,7 +5,7 @@ namespace NatashaFunctionUT.Template.Compile { [Trait("高级API功能测试", "方法")] - public class NDelegateTest : DomainPrepare + public class NDelegateTest : CompilerPrepareBase { [Fact(DisplayName = "委托混合测试")] public void CNDelegate() diff --git a/test/ut/NatashaFunctionUT/Template/Compile/StructBuilderTest.cs b/test/ut/NatashaFunctionUT/Template/Compile/StructBuilderTest.cs index ec36efb6..fb454da7 100644 --- a/test/ut/NatashaFunctionUT/Template/Compile/StructBuilderTest.cs +++ b/test/ut/NatashaFunctionUT/Template/Compile/StructBuilderTest.cs @@ -6,7 +6,7 @@ namespace NatashaFunctionUT.Template.Compile { [Trait("高级API功能测试", "OOP")] - public class StructBuilderTest : DomainPrepare + public class StructBuilderTest : CompilerPrepareBase { [Fact(DisplayName = "结构体构建与编译1")] diff --git a/test/ut/NatashaFunctionUT/Using/UsingTest.cs b/test/ut/NatashaFunctionUT/Using/UsingTest.cs index 9bb50c75..4209ae54 100644 --- a/test/ut/NatashaFunctionUT/Using/UsingTest.cs +++ b/test/ut/NatashaFunctionUT/Using/UsingTest.cs @@ -9,12 +9,12 @@ namespace NatashaFunctionUT { [Trait("基础功能测试", "Using")] - public class UsingTest : DomainPrepare + public class UsingTest : CompilerPrepareBase { [Fact(DisplayName = "默认Using的添加")] public void DefaultUsingTest() { - Assert.True(NatashaReferenceDomain.DefaultDomain.UsingRecorder.ToString() != string.Empty); + Assert.True(NatashaLoadContext.DefaultContext.UsingRecorder.ToString() != string.Empty); for (int i = 0; i < 6; i++) { diff --git a/test/ut/PluginFunctionUT/Compile/CompilePrepare.cs b/test/ut/PluginFunctionUT/Compile/CompilePrepare.cs index fb214e2b..2bc8b343 100644 --- a/test/ut/PluginFunctionUT/Compile/CompilePrepare.cs +++ b/test/ut/PluginFunctionUT/Compile/CompilePrepare.cs @@ -8,46 +8,41 @@ namespace NatashaFunctionUT.Compile public class CompilePrepare : DomainPrepare { [MethodImpl(MethodImplOptions.NoInlining)] - internal static (string name,string currentName,bool compileSucceed) CompileMetadataDiffCode(string code, AssemblyCompareInfomation referenceLoadBehavior) + internal static (string name, string currentName, bool compileSucceed) CompileMetadataDiffCode(string code, AssemblyCompareInfomation referenceLoadBehavior) { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory!,"Domain", "Reference", "1.0.0.0", _runtimeVersion, "MetadataDiff.dll"); + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory!, "Domain", "Reference", "1.0.0.0", _runtimeVersion, "MetadataDiff.dll"); var name = Guid.NewGuid().ToString("N"); var currentName = name; try { - using (DomainManagement.Create(name).CreateScope()) + AssemblyCSharpBuilder builder = new(); + builder.UseNewDomain(name); + currentName = builder.Domain.Name; + builder.ConfigCompilerOption(opt => opt.WithLowerVersionsAssembly()); + var pAssembly = builder.Domain.LoadPlugin(path); + var pType = pAssembly.GetTypes().Where(item => item.Name == "MetadataModel").First(); + var plugin = Activator.CreateInstance(pType); + builder.AddReferenceAndUsingCode(pAssembly); + builder.Add(code); + try + { + var assembly = builder + .WithCombineReferences(item => item.SetCompareInfomation(referenceLoadBehavior)) + .ConfigDomain(item => item.WithDefaultVersionDependency()) + .GetAssembly(); + return (name!, currentName!, true); + } + catch { - AssemblyCSharpBuilder builder = new(); - currentName = builder.Domain.Name; - builder.ConfigCompilerOption(opt => opt.WithLowerVersionsAssembly()); - var pAssembly = builder.Domain.LoadPlugin(path); - var pType = pAssembly.GetTypes().Where(item => item.Name == "MetadataModel").First(); - var plugin = Activator.CreateInstance(pType); - - - builder.Add(code); - try - { - var assembly = builder - .WithCombineReferences(item=>item.SetCompareInfomation(referenceLoadBehavior)) - .ConfigDomain(item=>item.WithDefaultVersionDependency()) - .GetAssembly(); - return (name!, currentName!, true); - } - catch - { - - return (name!, currentName!, false); - } - + return (name!, currentName!, false); } } finally { DomainManagement.Create(currentName!).Dispose(); } - + } } } diff --git a/test/ut/PluginFunctionUT/Domain/DomainPrepare.cs b/test/ut/PluginFunctionUT/Domain/DomainPrepare.cs index 3ae83a8d..20e47ffc 100644 --- a/test/ut/PluginFunctionUT/Domain/DomainPrepare.cs +++ b/test/ut/PluginFunctionUT/Domain/DomainPrepare.cs @@ -22,8 +22,8 @@ static DomainPrepare() _runtimeVersion = "net8.0"; #endif DefaultAssembliesCount = AssemblyLoadContext.Default.Assemblies.Count(); - NatashaInitializer.Preheating((item, name) => name!.Contains("IO"), true, false); - DefaultUsingCount = NatashaReferenceDomain.DefaultDomain.References.Count; + NatashaManagement.Preheating((item, name) => name!.Contains("IO"), true, false); + DefaultUsingCount = NatashaLoadContext.DefaultContext.References.Count; } } diff --git a/test/ut/PluginFunctionUT/Domain/Load/UnloadTest.cs b/test/ut/PluginFunctionUT/Domain/Load/UnloadTest.cs index 1817f1ec..b0d0476b 100644 --- a/test/ut/PluginFunctionUT/Domain/Load/UnloadTest.cs +++ b/test/ut/PluginFunctionUT/Domain/Load/UnloadTest.cs @@ -8,18 +8,15 @@ namespace NatashaFunctionUT.Domain.Load { [Trait("基础功能测试", "插件与域")] - public class UnloadTest + public class UnloadTest : DomainPrepareBase { - + [MethodImpl(MethodImplOptions.NoInlining)] public static string CreateAndUnload() { NatashaDomain? domain = default; - using (DomainManagement.Create("au_test").CreateScope()) - { - domain = DomainManagement.CurrentDomain; - Assert.Equal("au_test", domain.Name); - } + domain = (NatashaDomain)DomainManagement.Create("au_test").Domain; + Assert.Equal("au_test", domain.Name); domain.Dispose(); return "au_test"; } @@ -44,16 +41,14 @@ public static string LoadPluginAndUnload() { var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory!, "Domain", "Reference", "Libraries", "DNDV1.dll"); NatashaDomain? domain = default; - using (DomainManagement.Create("au_test_plugin").CreateScope()) - { - domain = DomainManagement.CurrentDomain; - Assert.Equal("au_test_plugin", domain.Name); - var assembly = domain.LoadPluginWithHighDependency(path, item => item.Name != null && item.Name.Contains("PluginBase")); - //var type = assembly.GetTypes().Where(item => item.Name == "P1").First(); - //IPluginBase plugin = (IPluginBase)(Activator.CreateInstance(type)!); - //强制加载所有引用 - //var result = plugin!.PluginMethod1(); - } + + domain = (NatashaDomain)DomainManagement.Create("au_test_plugin").Domain; + Assert.Equal("au_test_plugin", domain.Name); + var assembly = domain.LoadPluginWithHighDependency(path, item => item.Name != null && item.Name.Contains("PluginBase")); + //var type = assembly.GetTypes().Where(item => item.Name == "P1").First(); + //IPluginBase plugin = (IPluginBase)(Activator.CreateInstance(type)!); + //强制加载所有引用 + //var result = plugin!.PluginMethod1(); domain.Dispose(); return "au_test_plugin"; } @@ -61,7 +56,7 @@ public static string LoadPluginAndUnload() [Fact(DisplayName = "域的清理与卸载")] public static void ClearAndUnload() { - + var name = LoadPluginAndUnload(); for (int i = 0; i < 6; i++) { diff --git a/test/ut/PluginFunctionUT/Domain/Reference/GlobalReferenceTest.cs b/test/ut/PluginFunctionUT/Domain/Reference/GlobalReferenceTest.cs index 2a68cfcc..7237c493 100644 --- a/test/ut/PluginFunctionUT/Domain/Reference/GlobalReferenceTest.cs +++ b/test/ut/PluginFunctionUT/Domain/Reference/GlobalReferenceTest.cs @@ -1,6 +1,6 @@ using Microsoft.CodeAnalysis; using Microsoft.Extensions.DependencyModel; -using Natasha.CSharp.Component; +using Natasha.CSharp.Compiler.Component; using System; using System.Collections.Generic; using System.Linq; @@ -19,16 +19,15 @@ public void GlobalReference() .Default .CompileLibraries.SelectMany(cl => cl.ResolveReferencePaths()); - var count = NatashaReferenceDomain.DefaultDomain.References.Count; - Assert.True(NatashaReferenceDomain.DefaultDomain.UsingRecorder.HasUsing("System.Threading")); - Assert.False(NatashaReferenceDomain.DefaultDomain.UsingRecorder.HasUsing("System.IO")); - + var count = NatashaLoadContext.DefaultContext.References.Count; + Assert.True(NatashaLoadContext.DefaultContext.UsingRecorder.HasUsing("System.Threading")); + Assert.False(NatashaLoadContext.DefaultContext.UsingRecorder.HasUsing("System.IO")); } [Fact(DisplayName = "[默认引用]排重测试")] public unsafe void DefaultDistinctReference() { - NatashaReferenceCache referenceCache = new(); + NatashaMetadataCache referenceCache = new(); var assembilies = AppDomain.CurrentDomain.GetAssemblies();// AssemblyLoadContext.Default.Assemblies; int count = 0; foreach (var assembly in assembilies) @@ -70,8 +69,8 @@ public unsafe void DefaultDistinctReference() public void DistinctReferenceWithoutCompare() { var sets = GetPortableExecutableReferences(AssemblyCompareInfomation.None); - //dapper + json + plugin - Assert.Equal(3, sets.Count); + //dapper + json(12.0) + DNDV1 + runtime + Assert.Equal(4, sets.Count); } @@ -79,24 +78,40 @@ public void DistinctReferenceWithoutCompare() public void DistinctReferenceWithHighVersion() { var sets = GetPortableExecutableReferences(AssemblyCompareInfomation.UseHighVersion); - //dapper + json + plugin +#if NETCOREAPP3_1 + //dapper + json(12.0) + DNDV1 + Assert.Equal(3, sets.Count); +#else + //dapper + json(12.0) + DNDV1 Assert.Equal(3, sets.Count); +#endif } [Fact(DisplayName = "[低版本引用]排重测试")] public void DistinctReferenceWithLowVersion() { var sets = GetPortableExecutableReferences(AssemblyCompareInfomation.UseLowVersion); - //dapper + plugin +#if NETCOREAPP3_1 + //dapper + DNDV1 Assert.Equal(2, sets.Count); +#else + //dapper + DNDV1 + Assert.Equal(2, sets.Count); +#endif } [Fact(DisplayName = "[非同名引用]排重测试")] public void DistinctReferenceWithExistVersion() { var sets = GetPortableExecutableReferences(AssemblyCompareInfomation.UseDefault); - //dapper + plugin +#if NETCOREAPP3_1 + //dapper + DNDV1 + Assert.Equal(2, sets.Count); +#else + //dapper + DNDV1 Assert.Equal(2, sets.Count); +#endif + } } } diff --git a/test/ut/PluginFunctionUT/Domain/Reference/ReferencePrepare.cs b/test/ut/PluginFunctionUT/Domain/Reference/ReferencePrepare.cs index 48ca03d7..e36306ec 100644 --- a/test/ut/PluginFunctionUT/Domain/Reference/ReferencePrepare.cs +++ b/test/ut/PluginFunctionUT/Domain/Reference/ReferencePrepare.cs @@ -4,33 +4,46 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using Natasha.CSharp.Component; +using Natasha.CSharp.Compiler.Component; using System.Text; +using System.Diagnostics; public class ReferencePrepare : DomainPrepare { - internal protected static readonly NatashaReferenceCache DefaultReferences; + internal protected static readonly NatashaMetadataCache DefaultReferences; static ReferencePrepare() { - DefaultReferences = NatashaReferenceDomain.DefaultDomain.References; + NatashaManagement.RegistDomainCreator(); + DefaultReferences = NatashaLoadContext.DefaultContext.References; } internal static HashSet GetPortableExecutableReferences(AssemblyCompareInfomation loadBehavior) { - var domain = DomainManagement.Random(); - + var loadContext = DomainManagement.Random(); + var domain = (NatashaDomain)(loadContext.Domain); + AssemblyCSharpBuilder builder = new() + { + LoadContext = loadContext + }; + //12 1.6 3.1 var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory!, "Domain", "Reference", "Libraries", "DNDV1.dll"); - var assembly = domain.LoadPluginWithHighDependency(path,item=>item.Name!.Contains("PluginBase")); - + var assembly = domain.LoadPluginWithAllDependency(path,item=>item.Name!.Contains("PluginBase")); + builder.AddReferenceAndUsingCode(assembly, item => item.Name!.Contains("PluginBase")); var type1 = assembly.GetTypes().Where(item => item.Name == "P1").First(); IPluginBase plugin1 = (IPluginBase)(Activator.CreateInstance(type1)!); //强制加载所有引用 var result = plugin1!.PluginMethod1(); - - var references = domain.References.CombineWithDefaultReferences(DefaultReferences, loadBehavior); + var references = loadContext.References.CombineWithDefaultReferences(DefaultReferences, loadBehavior); var sets = new HashSet(references); //在合法的引用中排除默认引用 sets.ExceptWith(DefaultReferences.GetReferences()); + foreach (var item in sets) + { + var asm = loadContext.References.GetAssmeblyNameByMetadata(item); + asm ??= NatashaLoadContext.DefaultContext.References.GetAssmeblyNameByMetadata(item); + Debug.WriteLine("[[[=================="+asm.FullName); + } + return sets; } } diff --git a/test/ut/PluginFunctionUT/DomainPrepareBase.cs b/test/ut/PluginFunctionUT/DomainPrepareBase.cs new file mode 100644 index 00000000..90838765 --- /dev/null +++ b/test/ut/PluginFunctionUT/DomainPrepareBase.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NatashaFunctionUT +{ + public class DomainPrepareBase + { + static DomainPrepareBase() + { + NatashaManagement.RegistDomainCreator(); + } + } +} diff --git a/test/ut/PluginFunctionUT/PluginFunctionUT.csproj b/test/ut/PluginFunctionUT/PluginFunctionUT.csproj index 771c2e10..387612e2 100644 --- a/test/ut/PluginFunctionUT/PluginFunctionUT.csproj +++ b/test/ut/PluginFunctionUT/PluginFunctionUT.csproj @@ -32,7 +32,8 @@ - + +