首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET后台工作人员看不到前景中的COM对象

.NET后台工作人员看不到前景中的COM对象
EN

Stack Overflow用户
提问于 2015-01-02 22:33:08
回答 1查看 284关注 0票数 1

我们正在从一个主机3270客户端切换到另一个主机--攻击者反射到Bluezone。反射有一个很好的.NET API,但是访问Bluezone的唯一方法是通过COM。

我在解决方案中有一个公共类,它表示反射或Bluezone对象,它抓取现有客户机,不管它是什么,并与它通信。

在大多数情况下,一切正常。当我通过任何项目访问Bluezone COM对象时,它的功能就像反射一样。

问题似乎是当我在后台工作人员中访问Bluezone对象时。后台工作人员似乎无法在主线程上看到COM对象。

在调试模式下计算COM对象时,所有属性都会出现错误,“函数计算要求所有线程运行”错误。

我知道这是一个很长的机会,但是有人知道如何管理它,这样我就可以在后台线程中访问前台COM对象了吗?

我与供应商在许多问题上合作过,而且他们都很棒,但我觉得这可能是.NET/COM的事情。

我的最后一招是删除所有的后台工作人员,让用户处理屏幕冻结,但我真的不想这样做。我的另一个选项是在后台工作者中实例化COM对象,但是与此操作相关的成本。我尝试过Marshal.GetActiveObject(""),但是要么它不工作,要么我不知道应用程序的正确名称。

如果有人有类似的经验与COM和背景工作者,我会欢迎任何见解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-02 23:19:55

这在很大程度上取决于COM组件的设计。与.NET类不同的是,如果组件告诉COM它不支持线程处理,则COM保持代码线程安全。由ThreadingModel注册表项配置。COM通过自动封送调用(相当于.NET框架中的Invoke() )来确保满足这一要求。

因此,即使您从背景工作器的DoWork()事件处理程序中调用,这些调用不会在工作线程上运行,而是在创建对象的线程上执行。如果有必要,COM创建的STA线程。

调试器知道这一点,它可以很好地“看到”它们,它可以判断任何监视表达式都无法执行。因为它冻结了进程中的所有线程,但调试器线程除外。所以没有办法,这条信息提醒你。

只是一个调试工件。也许更多的是,您的BGW可能不是很有效,或者仍然会导致UI线程挂起。检查this post中创建COM友好线程的代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27749411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档