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

Ere*_*hen 5 windows sxs winforms activation-context-api

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

简化:

  1. 在运行时,我将带有清单文件的dll下载到某个目录而不进行注册.

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

  3. 让我们说创建A类并在B课之后.

在这个流程中一切顺利.

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

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

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

  • 有办法解决吗?

几点说明:

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

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

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

Mar*_*ell 1

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

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

马丁