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

C# 通过COM互操作访问C中的受保护内存,c#,memory,com,interop,C#,Memory,Com,Interop,我正在为EXE制作一个DLL插件。EXE以对象作为参数调用DLL中的函数,并从那里开始 在我把它拆分成一条新的线之前,一切都很顺利。这种错误会发生 试图读取或写入受保护的数据 记忆力这通常是一个迹象 另一个内存已损坏 在新线程中的对象上执行此代码时: protected object GetPropertyValue(object obj, string PropertyName) { return obj.GetType().InvokeMember(Prope

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

在我把它拆分成一条新的线之前,一切都很顺利。这种错误会发生

试图读取或写入受保护的数据 记忆力这通常是一个迹象 另一个内存已损坏

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

    protected object GetPropertyValue(object obj, string PropertyName)
    {
        return obj.GetType().InvokeMember(PropertyName, BindingFlags.GetProperty, null, obj, new object[] { });
    }
上面的代码试图访问COM对象上的属性。将函数更改为“public”不会影响它。但是,如果我只使用一个线程,代码就可以正常工作

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


感谢您的帮助

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

如果COM对象支持自由线程,那么它可能正在STA中运行,因为您的主方法被标记为STA thread属性

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


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

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

如果COM对象支持自由线程,那么它可能正在STA中运行,因为您的主方法被标记为STA thread属性

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


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

我无法控制COM对象,但您可以控制调用它的线程。如果它是STA com对象,则必须从拥有该对象的线程(即创建该对象的线程)访问它。或者,尝试添加设置BG线程以在创建STA时使用该对象。如果您这样做,我相信CLR将使用消息循环为您处理线程调度。对此,只需调用thread.setAppartmemtstate即可。谢谢,这就成功了!我将原始线程代理设置为覆盖它我无法控制COM对象,但您可以控制调用它的线程。如果它是STA com对象,则必须从拥有该对象的线程(即创建该对象的线程)访问它。或者,尝试添加设置BG线程以在创建STA时使用该对象。如果您这样做,我相信CLR将使用消息循环为您处理线程调度。对此,只需调用thread.setAppartmemtstate即可。谢谢,这就成功了!我让原始线程代理它