我有托管 CLR 运行时的 Win32 应用程序。不涉及线程。只是主线程。我发现每次调用托管端SynchronizationContext.Current
都会重置为空。我确实调用SynchronizationContext.SetSynchronizationContext
了实现IDotNetEngine
. 我打电话但仍然在SynchronizationContext.SetSynchronizationContext
它会恢复为空。我可以每次都设置它,但我使用 .Net 端的 WinForms 控件,并且该控件在用户按键时使用。并且因为它是 null 它会在代码中崩溃,因为该部分在不同的线程中执行。Method1
Method2
await
SynchronizationContext.Current
await
我在 .Net 的源代码中的 SynchronizationContext.cs 中找到了此文本
“问题是在反向 p/invoke 中设置为 AppDomain 的 SynchronizationContexts 不会保留在该 AppDomain 中;下一次同一个线程调用同一个 AppDomain, [....] 上下文将为空”。他们有解决方案,但不适用于桌面 .Net Framework。
所以我的问题是可以做些什么吗?.Net Framewrok 的那部分没有源代码,但看起来 .Netm_ExecutionContext
在离开运行时重置执行上下文 () 并将控制权返回给非托管代码。
详细信息:
我使用CorBindToRuntimeEx
thenAppDomain.CreateInstanceFrom
然后强制ObjectHandle.Unwrap
转换为IDotNetEngine
接口。
IDotNetEngine 声明如下:
[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("something")]
public interface IDotNetEngine
{
void Method1();
void Method2();
}
在非托管方面有类似的界面。