- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个有趣的情况,我需要做这样的事情:
[Export[typeof(ICandy1)]
[Export[typeof(ICandy2)]
public class Candy : ICandy2 { ... }
哪里
public interface ICandy1 { ... }
public interface ICandy2 : ICandy1 { ... }
我在任何地方都找不到任何有关使用多个 [Export] 属性的帖子,所以我想,管它呢,不妨尝试一下。
乍一看,它确实有效。我有几个方法可以调用 Candy 实例的两个接口(interface),效果很好。
但是,当我开始测试应用程序时,我发现行为不正确,并且在查看“输出”窗口时,我发现我收到了大量 COMException。我无法追踪它们都来自哪里,但它们总是在工作线程休眠时发生。我认为它必须来自主线程,但根本不知道如何调试它。 GUI 中不应该发生任何事情,我禁用了 DispatchTimers 以防万一——同样的事情。
比 COMExceptions 更奇怪的是单步执行代码时非常非常不稳定的行为。大约 30% 的情况下,当我单步执行时,它会跳出方法,或者单步执行两行代码!我不习惯看到完全奇怪的东西。
工作代码和非工作代码之间唯一发生的变化是通过我的插件加载代码引入了 MEF。因此,作为测试,我将插件程序集更改为仅导出一个接口(interface),并且对应用程序中依赖于另一个(现在未实现)接口(interface)的所有内容进行了硬编码。现在 COMException 消失了,奇怪的调试行为也消失了。
这是这里的人以前见过的东西吗?如果 MEF 不希望允许类导出多个接口(interface),那么在组合部件时不应该引发 CompositionException 吗?谁能解释一下为什么 MEF 会导致这些奇怪的问题???
下面是发生 COMException 时主线程调用堆栈的示例。不确定这对任何人是否意味着什么,但如果您能建议任何调试方法,那就太好了。
> UIAutomationProvider.dll!MS.Internal.Automation.UiaCoreProviderApi.UiaHostProviderFromHwnd(System.IntPtr hwnd) + 0x38 bytes
UIAutomationProvider.dll!System.Windows.Automation.Provider.AutomationInteropProvider.HostProviderFromHandle(System.IntPtr hwnd) + 0x2d bytes
PresentationCore.dll!MS.Internal.Automation.ElementProxy.HostRawElementProvider.get() + 0x65 bytes
[Native to Managed Transition]
[Managed to Native Transition]
UIAutomationProvider.dll!System.Windows.Automation.Provider.AutomationInteropProvider.RaiseAutomationPropertyChangedEvent(System.Windows.Automation.Provider.IRawElementProviderSimple element, System.Windows.Automation.AutomationPropertyChangedEventArgs e) + 0x2a bytes
PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() + 0x2c9 bytes
PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() + 0x2f8 bytes
PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() + 0x2f8 bytes
PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() + 0x2f8 bytes
PresentationCore.dll!System.Windows.ContextLayoutManager.fireAutomationEvents() + 0x98 bytes
PresentationCore.dll!System.Windows.ContextLayoutManager.UpdateLayout() + 0x65b bytes
PresentationCore.dll!System.Windows.ContextLayoutManager.UpdateLayoutCallback(object arg) + 0x19 bytes
PresentationCore.dll!System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork() + 0x10 bytes
PresentationCore.dll!System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks() + 0x97 bytes
PresentationCore.dll!System.Windows.Media.MediaContext.RenderMessageHandlerCore(object resizedCompositionTarget = null) + 0x80 bytes
PresentationCore.dll!System.Windows.Media.MediaContext.RenderMessageHandler(object resizedCompositionTarget) + 0x2b bytes
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate callback = {Method = Cannot evaluate expression because the code of the current method is optimized.}, object args = null, bool isSingleParameter = true) + 0x8a bytes
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.TryCatchWhen(object source = {System.Windows.Threading.Dispatcher}, System.Delegate callback, object args, bool isSingleParameter, System.Delegate catchHandler = null) + 0x4a bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.WrappedInvoke(System.Delegate callback, object args, bool isSingleParameter, System.Delegate catchHandler) + 0x44 bytes
WindowsBase.dll!System.Windows.Threading.DispatcherOperation.InvokeImpl() + 0x5d bytes
WindowsBase.dll!System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(object state) + 0x38 bytes
mscorlib.dll!System.Threading.ExecutionContext.runTryCode(object userData) + 0x51 bytes
[Native to Managed Transition]
[Managed to Native Transition]
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x67 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x45 bytes
WindowsBase.dll!System.Windows.Threading.DispatcherOperation.Invoke() + 0x63 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.ProcessQueue() + 0x127 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.WndProcHook(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled) + 0x63 bytes
WindowsBase.dll!MS.Win32.HwndWrapper.WndProc(System.IntPtr hwnd = 464158, int msg = 49869, System.IntPtr wParam = 0, System.IntPtr lParam = 0, ref bool handled = false) + 0xbe bytes
WindowsBase.dll!MS.Win32.HwndSubclass.DispatcherCallbackOperation(object o) + 0x7a bytes
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate callback = {Method = Cannot evaluate expression because the code of the current method is optimized.}, object args = {MS.Win32.HwndSubclass.DispatcherOperationCallbackParameter}, bool isSingleParameter = true) + 0x8a bytes
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.TryCatchWhen(object source = {System.Windows.Threading.Dispatcher}, System.Delegate callback, object args, bool isSingleParameter, System.Delegate catchHandler = null) + 0x4a bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.WrappedInvoke(System.Delegate callback, object args, bool isSingleParameter, System.Delegate catchHandler) + 0x44 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority priority, System.TimeSpan timeout, System.Delegate method, object args, bool isSingleParameter) + 0x91 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority priority, System.Delegate method, object arg) + 0x40 bytes
WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd = 464158, int msg = 49869, System.IntPtr wParam = 0, System.IntPtr lParam = 0) + 0xdc bytes
[Native to Managed Transition]
[Managed to Native Transition]
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame = {System.Windows.Threading.DispatcherFrame}) + 0xc7 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame frame) + 0x49 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.Run() + 0x4c bytes
PresentationFramework.dll!System.Windows.Application.RunDispatcher(object ignore) + 0x1e bytes
PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window window) + 0x6f bytes
PresentationFramework.dll!System.Windows.Application.Run(System.Windows.Window window) + 0x26 bytes
PresentationFramework.dll!System.Windows.Application.Run() + 0x19 bytes
Dan 指出,指定两个 ExportAttributes 可能会从不同的 ImportAttributes 创建两个实例,但我相信它只创建了一个实例,因为我在 Candy 的构造函数中放置了一个断点,并且它仅在应用程序的生命周期内被击中。
最佳答案
在一个类上有多个导出是 MEF 中完全正常的用例。我们一直这样做,没有出现任何问题。
丹的言论不正确。除非您明确设置 part creation policy在导入或导出时,MEF 更愿意重用容器内的实例,而不是创建多个实例。
您看到的 COM 异常与 MEF 无关,因为 MEF 本身是纯粹托管的,并且不使用任何 COM 互操作。您应该查看 COM 异常消息及其堆栈跟踪。要使调试器在发生此类异常时中断,请对 Visual Studio 进行相应配置(使用快捷键 ctrl+d、e 查看相关设置)。
您描述的不稳定的调试器行为通常意味着源代码和编译的程序集不匹配。尝试清理 bin 文件夹,并检查项目之间的依赖关系是否是项目引用而不是直接程序集引用。如果依赖项的源代码发生更改,直接程序集引用不会正确触发重建。
关于wpf - 使用 MEF 进行多次导出确实会造成一些令人发指的事情——为什么,为什么允许这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2677993/
我有此消息的CompositionException异常: “类型为'SomeService'的ComposablePart不能重新组合,因为它处于无效状态。只有在已经完全预览或组合的情况下,才可以重
我目前正在调查 MEF,以了解我们公司正在编写的软件的某种插件子系统的可行性。我想到的第一个问题是了解 MEF 组件对应用程序加载时间的影响。 此外,如果这很重要,是否有可能在运行时完全加载这些组件?
我开始学习,MEF 和其中一件重要的事情是我可以用导出属性标记一些项目(类、属性、方法),以便任何想要使用它的人都会在实例变量上创建导入属性并使用它。这种映射是如何发生的,何时发生?导入是按需延迟发生
我知道 MEF CompositionContainer 创建并保留类的实例。我不知道在什么情况下 CompositionContainer 在其内部有一个类实例。 任何人都可以列出在 Composi
我需要向我们现有的代码添加一些扩展点,并且我一直将 MEF 视为一种可能的解决方案。我们有一个 IRandomNumberGenerator 接口(interface),带有一个我们希望可交换的默认实
我看到 MEF ( MEF Codeplex site ) 上的新功能仍在继续工作,并且他们正在发布 MEF 2 beta 版本,但是他们没有关于新功能正在试验/探索/构建的任何体面的文档? 那么,作
我有一个对象实例,并且我希望最终得到一个包含该对象实例并导出为特定接口(interface)类型的 MEF 目录。我怎样才能做到这一点? TypeCatalog在这里似乎不起作用,因为(a)它创建一个
我计划在 ASP.NET 中使用 MEF,以深入了解 CompositionContainer 的线程安全性。 我的第一种方法将不同的 CompositionContainer 与每个请求相关联,但我
这类似于我的代码的外观 var catalog = new AssemblyCatalog(typeof(Program).Assembly); _container = new Compositio
我正在使用 MEF 和 System.ComponentModel.Composition.dll 来加载一些 dll。 我正在做类似的事情: AggregateCatalog catalog = n
我认识到,MEF 仅限于 metro 风格的应用程序。没有容器了,那么我怎样才能获得特定的导出值,如 ILogger logger = container.GetExportedValues(); ?
据我所知,为了使导入/导出属性相互正确连接,我必须对具有这些属性的每个新实例调用 compositionContainerInstance.Compose(...)。 是否可以自动发生这种情况,这样我
所以不使用 ExportMetadata 属性,为什么不直接扩展接口(interface)呢? 最佳答案 如果您通过 MEF 导入 Lazy<> 内容,则无需实例化对象即可查看元数据。 关于mef -
我正在尝试将 signalR 集线器作为使用 MEF 的插件的一部分。但是在 List<> 对象上调用 ImportMany 然后在 Global.asax 文件的 Application_Start
我找不到它!? 最佳答案 ExportFactory不是桌面 MEF 的一部分(但是 - 截至目前,它仅针对 Silverlight 发布)。看起来它将包含在 MEF 2 中。 与此同时,Glenn
安装包含 MEF 组件的 VSIX 项目时,Visual Studio 如何查找 MEF 组件?我知道常规方法可能是添加包含 MEF 部分的 dll 目录的目录。 Visual Studio 如何知道
是否可以将 IronPython 类声明为“导出”,从而将它们添加到 MEF 目录中主机 C# 应用程序可以导入吗? 我真的找不到任何具体的例子,只是猜测。 以下是我如何手动加载实现 .NET 接口(
MEF 团队一直在说它是关于插件模型的。那么,我们是在谈论 UI 插件吗?我们如何在非 UI 代码中使用这些东西? 我下载了代码,示例都是关于 GUI 的。我猜错了吗? 最佳答案 伊利亚 MEF 绝对
我有一个选项卡式应用程序,我希望用户能够在其中搜索某个人,然后在新 View 中显示此人的详细信息。用户应该能够为不同的人打开多个人的详细信息 View 。 我有点不确定我是否遵循了创建新 View
在 What's new in .NET 4.5微软表示 MEF 现在将支持“多范围”。这是什么意思?我在任何地方都找不到关于它的文档。 最佳答案 我相信你的问题在这个博客中得到了完整的回答:http
我是一名优秀的程序员,十分优秀!