SynchronizationContext.Current在来自非托管主机的每次调用时重置为null

时间:2014-03-28 06:15:13

标签: .net pinvoke clr-hosting

我有Win32应用程序,它承载CLR运行时。没有线程涉及。只是主线程。我发现每次调用托管端SynchronizationContext.Current都会重置为null。我在类构造函数中调用了SynchronizationContext.SetSynchronizationContext,它实现了IDotNetEngine。我在SynchronizationContext.SetSynchronizationContext中呼叫Method1但仍在Method2中,它将恢复为空。我可以每次都设置它但我使用.Net端的WinForms控件,当用户按下键时该控件使用await。并且因为SynchronizationContext.Current为null,它将在await之后的代码中崩溃,因为该部分在不同的线程中执行。

我在.Net的源代码中的SynchronizationContext.cs中找到了这个文本 “问题是在反向p / invoke内部设置的SynchronizationContexts不会持久存储在AppDomain中;下次同一个线程调用同一个AppDomain时,[....]上下文将为null”。他们有解决方案但不适用于桌面.Net Framework。

所以我的问题是可以对此采取行动吗? .Net Framewrok的那部分没有源代码,但看起来.Net在离开运行时并将控制返回到非托管代码时重置执行上下文(m_ExecutionContext)。

详细说明:
 我使用CorBindToRuntimeEx然后AppDomain.CreateInstanceFrom,然后将ObjectHandle.Unwrap投射到IDotNetEngine界面。

IDotNetEngine声明如下:

[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("something")] 
public interface IDotNetEngine
{

    void Method1();
    void Method2();
}

并且在非管理方面有类似的界面。

0 个答案:

没有答案
相关问题