C# 通过COM互操作访问C中的受保护内存
我正在为EXE制作一个DLL插件。EXE以对象作为参数调用DLL中的函数,并从那里开始 在我把它拆分成一条新的线之前,一切都很顺利。这种错误会发生 试图读取或写入受保护的数据 记忆力这通常是一个迹象 另一个内存已损坏 在新线程中的对象上执行此代码时: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
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即可。谢谢,这就成功了!我让原始线程代理它