1

我有托管 CLR 运行时的 Win32 应用程序。不涉及线程。只是主线程。我发现每次调用托管端SynchronizationContext.Current都会重置为空。我确实调用SynchronizationContext.SetSynchronizationContext了实现IDotNetEngine. 我打电话但仍然在SynchronizationContext.SetSynchronizationContext它会恢复为空。我可以每次都设置它,但我使用 .Net 端的 WinForms 控件,并且该控件在用户按键时使用。并且因为它是 null 它会在代码中崩溃,因为该部分在不同的线程中执行。Method1Method2awaitSynchronizationContext.Currentawait

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

所以我的问题是可以做些什么吗?.Net Framewrok 的那部分没有源代码,但看起来 .Netm_ExecutionContext在离开运行时重置执行上下文 () 并将控制权返回给非托管代码。

详细信息:
我使用CorBindToRuntimeExthenAppDomain.CreateInstanceFrom然后强制ObjectHandle.Unwrap转换为IDotNetEngine接口。

IDotNetEngine 声明如下:

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

    void Method1();
    void Method2();
}

在非托管方面有类似的界面。

4

0 回答 0