满足 ImportsOnce ObjectDisposedException

SatisfyImportsOnce ObjectDisposedException

堆栈跟踪:

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.ComponentModel.Composition.ReflectionModel.DisposableReflectionComposablePart'.
   at System.ComponentModel.Composition.ReflectionModel.DisposableReflectionComposablePart.EnsureRunning()
   at System.ComponentModel.Composition.ReflectionModel.ReflectionComposablePart.System.ComponentModel.Composition.Primitives.ICompositionElement.get_Origin()
   at System.ComponentModel.Composition.CompositionException.WriteElementGraph(StringBuilder writer, ICompositionElement element)
   at System.ComponentModel.Composition.CompositionException.WriteError(StringBuilder writer, CompositionError error)
   at System.ComponentModel.Composition.CompositionException.WritePath(StringBuilder writer, IEnumerable`1 path, Int32 ordinal)
   at System.ComponentModel.Composition.CompositionException.WritePaths(StringBuilder writer, IEnumerable`1 paths)
   at System.ComponentModel.Composition.CompositionException.BuildDefaultMessage()
   at System.ComponentModel.Composition.CompositionException.get_Message()

从 MSDN 文档中,我可以看到它在处理容器时会出现异常,但它从未 .Dispose() 过。

我正在使用它来导入实际的表单以增加破解尝试的额外安全性。

它仅发生在用户的 Windows 服务器 2008 (不知道是否为 r2)(已确认为 R2) 它已被证明可以在其他用户 Server 2008 系统 (RDP) 上使用相同的代码。

AggregateCatalog aggregateCatalog = new AggregateCatalog();
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
CompositionContainer _container = new CompositionContainer(aggregateCatalog, true);
_container.ComposeExportedValue<ExportProvider>(_container);
_container.ComposeExportedValue(_container);
_container.ComposeExportedValue<ICompositionService>(_container);
Program program = new Program();
_container.SatisfyImportsOnce(program);
program._Run();
_container.Dispose();

上面的代码正是我 运行 我可以确认它发生在 SatisfyImportsOnce 而不是 _Run(); (需要导入)

编辑这仍然发生,我从一个遇到错误的用户那里得到了 mdmp 文件,这次是 Windows 7 SP1 上的用户和另一个 Windows 10 Latest 上的用户。 :/

这个古老的错误已经修复!

原因是...损坏的注册表项。
哈哈。

解决方法如下: 在 CMD 中,输入 lodctr /r

这是一个与性能计数器类似的错误,它们都有完全相同的修复。

我通过查看异常数据发现了这一点,我查看了所有数据,如 TargetSite、Source、Message e.t.c,在某处它说了以下内容: Indikatornamensdaten können nicht geladen werden, da ein ungültiger Index "" aus der Registrierung gelesen wurde.

这简单地表示注册表中的索引是 empty/missing。做了一些研究,我之前遇到过的性能计数器也出现了同样的错误。所以我应用了相同的修复程序,这就像变魔术一样。

:) 享受每个人都为这个错误撕扯头发!祝你好运!