通过COM互操作访问C#中的受保护内存

时间:2009-11-25 21:43:13

标签: c# memory com interop

我正在为EXE制作DLL“插件”。 EXE以DLL作为参数调用DLL中的函数,并从那里开始。

一切正常,花花公子,直到我将它拆分为新线程。发生此错误

  

尝试读取或写入受保护的   记忆。这通常是一个迹象   其他记忆已经腐败。

在新线程中的对象上执行此代码时:

    protected object GetPropertyValue(object obj, string PropertyName)
    {
        return obj.GetType().InvokeMember(PropertyName, BindingFlags.GetProperty, null, obj, new object[] { });
    }

以上是尝试访问COM对象的属性。将功能更改为“公共”不会影响它。如果我只使用一个线程,代码就可以正常工作。

发生的事情很清楚:新线程无法访问EXE中的变量。我怎样才能解决这个问题?不使用线程不是一个可行的选择。

感谢任何帮助

1 个答案:

答案 0 :(得分:4)

您的COM对象可能存在于STA中。这意味着您需要调度回拥有该对象的线程,并从那里进行调用。

如果COM对象支持空闲线程,那么它可能在STA中运行,因为您的main方法标有STA线程属性。

或者,如果您控制COM对象,则可以尝试将其设为MTA对象。

在这种情况下,请尝试删除该属性。但是,如果您使用的是Windows表单,则必须从STA线程创建表单。