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

时间:2011-01-12 22:58:54

标签: windows winforms sxs activation-context-api

我有一个应用程序,它使用隔离部署中本机COM dll的一些类。

简体:

  1. 在运行时我将dll及其清单文件下载到某个版本 没有注册的目录。

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

  3. 让我们说创建A类,然后在B类之后。

  4. 在这个流程中一切顺利。

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

    所以似乎WinForm以某种方式弄乱了我的激活上下文。

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

    • 有办法吗?

    很少注意到:

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

    • 我尝试评论出Application.EnableVisualStyles(),但没有帮助。

    • 如果我使用create并销毁激活上下文将每个调用包装到我的dll,它可以工作但我自然不想去那里...

1 个答案:

答案 0 :(得分:1)

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

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

马丁