Hallo!
Folgender Code verursacht eine Exception
interface IFoo { }
class Foo : IFoo { }
interface IBar { }
class Bar : IBar {
public Bar(IEnumerable<IFoo> foos) { }
}
public class MainClass {
public static void Main() {
var builder = new ContainerBuilder();
builder.Register<IFoo, Foo>();
builder.Register<IBar, Bar>();
IContainer container = builder.Build();
container.ResolveAll<IBar>().ToArray();
}
}
Im Aufruf von ToArray kommt die InvalidOperationException
"Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden."
Stacktrace
bei System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
bei System.Collections.Generic.Dictionary`2.ValueCollection.Enumerator.MoveNext()
bei System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
bei System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
bei System.Linq.Enumerable.<CastIterator>d__aa`1.MoveNext()
bei System.Linq.Buffer`1..ctor(IEnumerable`1 source)
bei System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
bei Example.MainClass.Main() in C:\XXXXXX\MainForm.cs:Zeile 30.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
Verwendete Version:
Download von der Homepage: LightCore-1.4.1-net-3.5.zip
Viele Grüße,
Uwe
Hoi Uwe
Ich habs mal kurz angeschaut (Ohne Debugging).
Der Fehler tritt nur auf, wenn ein "IBar" registriert ist, ab einer Anzahl von mehr als 1 läufts.
Melde mich später wieder, wenn ich den Fehler gefunden habe 😃.
Jetzt schon vielen Dank für die Rückmeldung!
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Der Fehler tritt nur auf, wenn ein "IBar" registriert ist, ab einer Anzahl von mehr als 1 läufts.
Ahh, das erklärt, warum der Fehler bei mir plötzlich aufgetaucht ist (und wie ich ihn einfach umgehen kann...)
Vielen Grüße,
Uwe
Hallo Uwe
Der Bug ist gefixt und ins SVN Repository eingecheckt.
Wenn alle bekannte Bugs gefixt worden sind, gibt es einen neuen Release.
Fixed ResolveAll throws InvalidOperationException bug.
see: (LightCore - ResolveAll<T>().ToArray() wirft InvalidOperationException).
Beschreibung:
Wieso das es mit nur einer Registrierung krachte, jedoch mit zwei nicht, ist mir immer noch ein Rätsel.
Das Verhalten sollte eigentlich bei beiden das gleiche sein.
Ich konnte es auch nachvollziehen, jedoch nach meiner Änderung nicht mehr.
Schlussendlich lag es daran, das beim Aufruf von ResolveAll, ein bis mehrmals intern Resolve aufgerufen wird und dieser Aufruf die Auflistung mit den Registrierungen geändert hat (Registrierung hinzugefügt).
Die Lösung war, die Enumeration am Anfang von ResolveAll per .ToList() zu kopieren, sodass die sich nicht in die Quere kommen, d.h. es egal ist, wenn die Original Enumeration geändert wird.
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Hallo Peter!
Vielen Dank für deine Nachtschicht! Werde gleich ein SVN-Update machen.
Viele Grüße,
Uwe