@@ -128,7 +128,7 @@ public IEnumerable<PluginContext> LoadPlugins(PluginPackage package)
128128
129129 VerifyPackage ( package ) ;
130130
131- Dictionary < string , Dictionary < string , PluginMetadata > > loadCondidates = [ ] ;
131+ Dictionary < string , Dictionary < string , PluginLoadSession > > loadCondidates = [ ] ;
132132
133133 foreach ( PluginMetadata ent in package . PackageInfo . Plugins )
134134 {
@@ -139,7 +139,7 @@ public IEnumerable<PluginContext> LoadPlugins(PluginPackage package)
139139 continue ;
140140 }
141141
142- if ( ! loadCondidates . TryGetValue ( ent . Id , out Dictionary < string , PluginMetadata > ? value ) )
142+ if ( ! loadCondidates . TryGetValue ( ent . Id , out Dictionary < string , PluginLoadSession > ? value ) )
143143 {
144144 value = [ ] ;
145145 loadCondidates [ ent . Id ] = value ;
@@ -151,26 +151,27 @@ public IEnumerable<PluginContext> LoadPlugins(PluginPackage package)
151151 continue ;
152152 }
153153
154- value [ ent . BuildTag ] = ent ;
154+ value [ ent . BuildTag ] = session ;
155155 }
156156
157- List < PluginMetadata > chosenEntries = PickPlugins ( loadCondidates ) ;
157+ var chosenEntries = PickPlugins ( loadCondidates ) ;
158158
159- if ( chosenEntries . Count == 0 ) throw new ArgumentException ( "Can't find any suitable plugins in this package" ) ;
160-
161- List < PluginContext > plugins = [ ] ;
162- foreach ( PluginMetadata entry in chosenEntries )
159+ if ( ! chosenEntries . Any ( ) )
163160 {
164- PluginLoadSession session = LoadSessions . Values . Where ( x => x . Metadata == entry ) . Single ( ) ;
161+ throw new ArgumentException ( "Can't find any suitable plugins in this package" ) ;
162+ }
165163
164+ List < PluginContext > contexts = new ( ) ;
165+ foreach ( PluginLoadSession session in chosenEntries )
166+ {
166167 _ = session . TryRun ( ( ) =>
167168 {
168169 string tempPath = Path . Combine ( session . Implementation ! . TempPath , session . Package . PackageInfo . Id ) ;
169170 Directory . CreateDirectory ( tempPath ) ;
170171
171- package . ExtractPlugin ( entry , tempPath ) ;
172+ package . ExtractPlugin ( session . Metadata , tempPath ) ;
172173
173- session . AssemblyPath = Path . Combine ( tempPath , $ "{ entry . Id } -{ entry . BuildTag } ", entry . Assembly ) ;
174+ session . AssemblyPath = Path . Combine ( tempPath , $ "{ session . Metadata . Id } -{ session . Metadata . BuildTag } ", session . Metadata . Assembly ) ;
174175 session . Token = SecurityContext . RegisterPlugin ( session ) ;
175176
176177 CasPolicyBuilder policyBuilder = new CasPolicyBuilder ( ) ;
@@ -185,10 +186,10 @@ public IEnumerable<PluginContext> LoadPlugins(PluginPackage package)
185186 PluginContext context = new PluginContext ( session ) ;
186187 session . Implementation ! . Add ( context ) ;
187188
188- plugins . Add ( context ) ;
189+ contexts . Add ( context ) ;
189190 }
190191
191- return plugins ;
192+ return contexts ;
192193 }
193194
194195 /// <summary>
@@ -290,26 +291,31 @@ private PluginLoadSession CreateSession(PluginPackage package,
290291 /// <returns>
291292 /// A list of chosen plugin metadata.
292293 /// </returns>
293- private static List < PluginMetadata > PickPlugins ( Dictionary < string , Dictionary < string , PluginMetadata > > loadCondidates )
294+ private static IEnumerable < PluginLoadSession > PickPlugins ( Dictionary < string , Dictionary < string , PluginLoadSession > > loadCondidates )
294295 {
295- List < PluginMetadata > chosenEntries = [ ] ;
296- foreach ( Dictionary < string , PluginMetadata > plg in loadCondidates . Values )
296+ foreach ( Dictionary < string , PluginLoadSession > plg in loadCondidates . Values )
297297 {
298298 if ( plg . Count == 1 )
299299 {
300- chosenEntries . Add ( plg . First ( ) . Value ) ;
300+ yield return plg . Values . First ( ) ;
301301 continue ;
302302 }
303303
304- PluginMetadata ? chosenEnt = plg . Values
305- . Where ( v => v . TargetFrameworkVersion <= RuntimeVersion ) // Only consider versions lower or equal to the runtime version
306- . OrderByDescending ( v => v . TargetFrameworkVersion ) // Get the largest version among them
307- . FirstOrDefault ( ) ;
304+ var sorted = plg . Values
305+ . Where ( v => v . Metadata . TargetFrameworkVersion <= RuntimeVersion ) // Only consider versions lower or equal to the runtime version
306+ . OrderByDescending ( v => v . Metadata . TargetFrameworkVersion ) ; // Get the largest version among them
308307
309- if ( chosenEnt . HasValue ) chosenEntries . Add ( chosenEnt . Value ) ;
310- }
308+ foreach ( var entry in sorted . Skip ( 1 ) )
309+ {
310+ entry . Result = PluginLoadResult . Skipped ;
311+ }
311312
312- return chosenEntries ;
313+ var chosen = sorted . FirstOrDefault ( ) ;
314+ if ( chosen != null )
315+ {
316+ yield return chosen ;
317+ }
318+ }
313319 }
314320
315321 /// <summary>
0 commit comments