1+ using System ;
2+ using System . IO ;
3+
4+ namespace UsingMSBuildCopyOutputFileToFastDebug
5+ {
6+ public static class TargetFrameworkChecker
7+ {
8+ public static bool CheckCanCopy ( FileInfo targetExecutableFile , CopyOutputFileOptions copyOutputFileOptions )
9+ {
10+ DotNetType targetFramework = GetTargetFrameworkDotNetType ( copyOutputFileOptions . TargetFramework ) ;
11+
12+ var exeDotNetType = GetExecutableFileDotNetType ( targetExecutableFile ) ;
13+
14+ return IsCompatible ( exeDotNetType , targetFramework ) ;
15+ }
16+
17+ /// <summary>
18+ /// 判断 a 是否兼容 b 版本
19+ /// </summary>
20+ /// <param name="a"></param>
21+ /// <param name="b"></param>
22+ /// <returns></returns>
23+ private static bool IsCompatible ( DotNetType a , DotNetType b )
24+ {
25+ if ( a . HasFlag ( DotNetType . NetCore ) && b . HasFlag ( DotNetType . NetCore ) )
26+ {
27+ return true ;
28+ }
29+
30+ if ( a . HasFlag ( DotNetType . NetFramework ) && b . HasFlag ( DotNetType . NetFramework ) )
31+ {
32+ return true ;
33+ }
34+
35+ return false ;
36+ }
37+
38+ private static DotNetType GetExecutableFileDotNetType ( FileInfo targetExecutableFile )
39+ {
40+ // 先兼容判断,当前业务逻辑没有那么复杂,毕竟写了周六日了怕两周都写不完
41+ var name = Path . GetFileNameWithoutExtension ( targetExecutableFile . FullName ) ;
42+ // 如果是存在 runtimeconfig.json 和 deps.json 文件,那就是 .NET Core 的
43+ var runtimeConfigFile = Path . Combine ( targetExecutableFile . DirectoryName ! , $ "{ name } .runtimeconfig.json") ;
44+ var depsFile = Path . Combine ( targetExecutableFile . DirectoryName ! , $ "{ name } .deps.json") ;
45+
46+ if ( File . Exists ( runtimeConfigFile ) || File . Exists ( depsFile ) )
47+ {
48+ return DotNetType . NetCore ;
49+ }
50+
51+ return DotNetType . NetFramework ;
52+ }
53+
54+ private static DotNetType GetTargetFrameworkDotNetType ( string targetFramework )
55+ {
56+ if ( targetFramework . Contains ( "net40" ) )
57+ {
58+ return DotNetType . NetFramework40 ;
59+ }
60+
61+ if ( targetFramework . Contains ( "net45" ) )
62+ {
63+ return DotNetType . NetFramework45 ;
64+ }
65+
66+ if ( targetFramework . Contains ( "net46" ) )
67+ {
68+ return DotNetType . NetFramework46 ;
69+ }
70+
71+ if ( targetFramework . Contains ( "net47" ) )
72+ {
73+ return DotNetType . NetFramework47 ;
74+ }
75+
76+ if ( targetFramework . Contains ( "net48" ) )
77+ {
78+ return DotNetType . NetFramework48 ;
79+ }
80+
81+ if ( targetFramework . Contains ( "netcoreapp1" ) )
82+ {
83+ return DotNetType . NetCore1 ;
84+ }
85+
86+ if ( targetFramework . Contains ( "netcoreapp2" ) )
87+ {
88+ return DotNetType . NetCore2 ;
89+ }
90+
91+ if ( targetFramework . Contains ( "netcoreapp3" ) )
92+ {
93+ return DotNetType . NetCore3 ;
94+ }
95+
96+ if ( targetFramework . Contains ( "net5." ) )
97+ {
98+ return DotNetType . Net5 ;
99+ }
100+
101+ if ( targetFramework . Contains ( "net6." ) )
102+ {
103+ return DotNetType . Net6 ;
104+ }
105+
106+ throw new ArgumentException ( $ "Unknown TargetFrame { targetFramework } ") ;
107+ }
108+ }
109+
110+ [ Flags ]
111+ public enum DotNetType
112+ {
113+ NetFramework = 1 << 25 ,
114+ NetCore = 1 << 26 ,
115+ // 还没有需求,就不写了
116+ NetStandard = 1 << 27 ,
117+
118+ NetFramework40 = 1 << 0 | NetFramework ,
119+ NetFramework45 = 1 << 1 | NetFramework ,
120+ // 对于 4.5.1 等,都归为 45 好了
121+ //NetFramework451 = 1 << 2 | NetFramework,
122+ //NetFramework452 = 1 << 3 | NetFramework,
123+ NetFramework46 = 1 << 4 | NetFramework ,
124+ NetFramework47 = 1 << 5 | NetFramework ,
125+ NetFramework48 = 1 << 6 | NetFramework ,
126+
127+ NetCore1 = 1 << 11 | NetCore ,
128+ NetCore2 = 1 << 12 | NetCore ,
129+ NetCore3 = 1 << 13 | NetCore ,
130+
131+ Net5 = 1 << 15 | NetCore ,
132+ Net6 = 1 << 16 | NetCore ,
133+
134+ }
135+ }
0 commit comments