Windows 使用WinForm时激活上下文丢失?

Windows 使用WinForm时激活上下文丢失?,windows,winforms,sxs,activation-context-api,Windows,Winforms,Sxs,Activation Context Api,我有一个应用程序,它在独立部署中使用本机COM dll中的一些类 简化: 在运行时,我将dll及其清单文件下载到特定位置 没有注册的目录 然后我创建一个指向该目录的激活上下文,并 然后从dll创建类的实例 比如说创建类A,然后创建一段时间后创建类B 在这个流程中,一切都进展顺利 当我将应用程序更改为WinForm时,问题就开始了。 当按下“按钮1”时,我像以前一样创建激活上下文,然后创建类A的实例。 这很好,流返回到我的WinForm。 但是,当按下“按钮2”时,我无法创建类B。 我遇到一个异常

我有一个应用程序,它在独立部署中使用本机COM dll中的一些类

简化:

  • 在运行时,我将dll及其清单文件下载到特定位置 没有注册的目录

  • 然后我创建一个指向该目录的激活上下文,并 然后从dll创建类的实例

  • 比如说创建类A,然后创建一段时间后创建类B

  • 在这个流程中,一切都进展顺利

    当我将应用程序更改为WinForm时,问题就开始了。 当按下“按钮1”时,我像以前一样创建激活上下文,然后创建类A的实例。 这很好,流返回到我的WinForm。 但是,当按下“按钮2”时,我无法创建类B。 我遇到一个异常,说找不到该类

    看来WinForm在某种程度上扰乱了我的激活上下文

    • 为什么呢?那里发生了什么

    • 有办法绕过它吗

    几点注意:

    • 我尝试使用sxstrace.exe创建激活上下文,但它只记录我的激活上下文创建

    • 我尝试对Application.EnableVisualStyles()进行注释,但没有任何帮助

    • 如果我用create和destroy激活上下文包装每个对dll的调用,它会工作,但我当然不想去那里


    CLR不保证在传递托管代码时维护/保留Win32激活上下文

    解决方法是调用本机代码,在那里设置激活上下文,执行所需操作,然后恢复上下文。您可能只需要在加载和绑定到对象时使用它,所以一旦有了IUnknown,就可以返回它

    马汀