【问题标题】:Activation Context lost when working with WinForm?使用 WinForm 时丢失激活上下文?
【发布时间】:2011-01-12 22:58:53
【问题描述】:

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

简体:

  1. 在运行时,我将 dll 及其清单文件下载到某个 目录而不注册它。

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

  3. 假设创建 A 类,然后创建 B 类。

在这个流程中一切顺利。

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

所以看起来 WinForm 以某种方式弄乱了我的激活上下文。

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

  • 有办法解决吗?

几点说明:

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

  • 我尝试注释掉 Application.EnableVisualStyles() 但没有帮助。

  • 如果我使用 create 和 destroy Activation Context 包装对我的 dll 的每个调用,它可以工作,但我自然不想去那里......

【问题讨论】:

    标签: windows winforms sxs activation-context-api


    【解决方案1】:

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

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

    马丁

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多