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

标签 windows winforms sxs activation-context-api

我有一个应用程序在隔离部署中使用 native COM dll 中的一些类。

简化:

  1. 在运行时,我将 dll 及其 list 文件下载到某个特定位置 目录而不注册。

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

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

在这个流程中一切顺利。

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

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

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

  • 有解决办法吗?

一些注意事项:

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

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

  • 如果我用创建和销毁 Activation Context 包装对我的 dll 的每次调用,它可以工作,但自然我不想去那里...

最佳答案

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

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

马丁

关于windows - 使用 WinForm 时激活上下文丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4675001/

相关文章:

java - 扩展程序参数中的通配符

.net - 当使用 SxS 和 list 文件时,.net 调用 COM 并调用其他 .net COM 对象是否有效

vb6 - 用VB6开发免注册COM应用程序

c++ - 缺少方法: SXS and Controls.的奇怪案例在 "object doesn'中添加结果支持此属性或方法”?

windows - Git 使所有 check out 文件的行尾为 CRLF

python - 如何在网络路径上正确使用 os.listdir?

c++ - MinGW-w64 的 gcc 和 Address Sanitizer

c# - Windows.Forms SplitContainer.SplitterWidth 不会在运行时保持设置

c# - WPF 模态窗口作为 WinForms 中的工具窗口消失

c# - 如何在 AxAcroPdf 中获取 pdf 文件的页数?