我们正在从一个主机3270客户端切换到另一个主机--攻击者反射到Bluezone。反射有一个很好的.NET API,但是访问Bluezone的唯一方法是通过COM。
我在解决方案中有一个公共类,它表示反射或Bluezone对象,它抓取现有客户机,不管它是什么,并与它通信。
在大多数情况下,一切正常。当我通过任何项目访问Bluezone COM对象时,它的功能就像反射一样。
问题似乎是当我在后台工作人员中访问Bluezone对象时。后台工作人员似乎无法在主线程上看到COM对象。
在调试模式下计算COM对象时,所有属性都会出现错误,“函数计算要求所有线程运行”错误。

我知道这是一个很长的机会,但是有人知道如何管理它,这样我就可以在后台线程中访问前台COM对象了吗?
我与供应商在许多问题上合作过,而且他们都很棒,但我觉得这可能是.NET/COM的事情。
我的最后一招是删除所有的后台工作人员,让用户处理屏幕冻结,但我真的不想这样做。我的另一个选项是在后台工作者中实例化COM对象,但是与此操作相关的成本。我尝试过Marshal.GetActiveObject(""),但是要么它不工作,要么我不知道应用程序的正确名称。
如果有人有类似的经验与COM和背景工作者,我会欢迎任何见解。
发布于 2015-01-02 23:19:55
这在很大程度上取决于COM组件的设计。与.NET类不同的是,如果组件告诉COM它不支持线程处理,则COM保持代码线程安全。由ThreadingModel注册表项配置。COM通过自动封送调用(相当于.NET框架中的Invoke() )来确保满足这一要求。
因此,即使您从背景工作器的DoWork()事件处理程序中调用,这些调用不会在工作线程上运行,而是在创建对象的线程上执行。如果有必要,COM创建的STA线程。
调试器知道这一点,它可以很好地“看到”它们,它可以判断任何监视表达式都无法执行。因为它冻结了进程中的所有线程,但调试器线程除外。所以没有办法,这条信息提醒你。
只是一个调试工件。也许更多的是,您的BGW可能不是很有效,或者仍然会导致UI线程挂起。检查this post中创建COM友好线程的代码。
https://stackoverflow.com/questions/27749411
复制相似问题