The code then throws a LockRecursionException in AssemblyList.GetEnumerator(), caused by EnterReadLock() when another lock is already held.
This is probably caused by the fact that System.Configuration and System.Configuration.ConfigurationManager are both assemblies that need to be loaded, and there is a race condition between the AssemblyLoadHandler, the ResolveHandler, LookupType and FindLoadedAssembly.
@denfromufa A PR is in the wings, but I wasn't sure whether there was too much going on at the moment?
I'll see if I can get the same thing to happen in other runtimes with a "fake" example - I think the naming of System.Configuration and System.Configuration.ConfigurationManager is significant, as is the fact that the second uses types from the first ...
Not so easy to put this into the tests, I think, it needs two assemblies ...
Please assign it to me, I'll get a PR out soon, hopefully with a covering test.
Activity
Cronan commented on Feb 13, 2018
I was able to fix this by replacing the AssemblyList implementation with:
and a constructor:
den-run-ai commented on Feb 13, 2018
@Cronan pull requests are welcome :) thanks for finding this! I wonder if there is the same lock recursion in other .NET runtimes?
Cronan commented on Feb 13, 2018
@denfromufa A PR is in the wings, but I wasn't sure whether there was too much going on at the moment?
I'll see if I can get the same thing to happen in other runtimes with a "fake" example - I think the naming of System.Configuration and System.Configuration.ConfigurationManager is significant, as is the fact that the second uses types from the first ...
Not so easy to put this into the tests, I think, it needs two assemblies ...
Please assign it to me, I'll get a PR out soon, hopefully with a covering test.
den-run-ai commented on Feb 13, 2018
@Cronan this PR is small enough to be merged without much effort. Some PRs are not like that.