我有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();
}
并且在非管理方面有类似的界面。