@@ -91,6 +91,46 @@ public void DerivedTypeScanFollowsTransitiveAssemblyReferences()
9191 loadedAssemblies ) ) ;
9292 }
9393
94+ [ Fact ]
95+ public void DerivedTypeScanDoesNotFollowSameNameAssembliesWithDifferentIdentities ( )
96+ {
97+ string assemblyName = $ "S1API.ReflectionUtilsTests.Duplicate.{ Guid . NewGuid ( ) : N} ";
98+ AssemblyBuilder unrelatedAssembly = CreateDynamicAssembly ( assemblyName , new Version ( 1 , 0 , 0 , 0 ) ) ;
99+ Type unrelatedType = unrelatedAssembly
100+ . DefineDynamicModule ( assemblyName )
101+ . DefineType ( "UnrelatedType" , TypeAttributes . Public )
102+ . CreateType ( ) ! ;
103+
104+ AssemblyBuilder relatedAssembly = CreateDynamicAssembly ( assemblyName , new Version ( 2 , 0 , 0 , 0 ) ) ;
105+ relatedAssembly
106+ . DefineDynamicModule ( assemblyName )
107+ . DefineType ( "RelatedType" , TypeAttributes . Public , typeof ( ReflectionCandidateBridge ) )
108+ . CreateType ( ) ;
109+
110+ AssemblyBuilder candidateAssembly = CreateDynamicAssembly (
111+ $ "S1API.ReflectionUtilsTests.Candidate.{ Guid . NewGuid ( ) : N} ",
112+ new Version ( 1 , 0 , 0 , 0 ) ) ;
113+ ModuleBuilder candidateModule = candidateAssembly . DefineDynamicModule ( candidateAssembly . GetName ( ) . Name ! ) ;
114+ candidateModule
115+ . DefineType ( "CandidateType" , TypeAttributes . Public , unrelatedType )
116+ . CreateType ( ) ;
117+
118+ Assert . False ( ReflectionUtils . CanContainTypesDerivedFrom (
119+ candidateAssembly ,
120+ typeof ( ReflectionUtils ) . Assembly ,
121+ AppDomain . CurrentDomain . GetAssemblies ( ) ) ) ;
122+ }
123+
124+ private static AssemblyBuilder CreateDynamicAssembly ( string name , Version version )
125+ {
126+ var assemblyName = new AssemblyName ( name )
127+ {
128+ Version = version
129+ } ;
130+
131+ return AssemblyBuilder . DefineDynamicAssembly ( assemblyName , AssemblyBuilderAccess . Run ) ;
132+ }
133+
94134 private sealed class MonoShape
95135 {
96136#pragma warning disable CS0169
0 commit comments