我有一个应用程序,它使用隔离部署中本机COM dll的一些类。
简体:
在运行时我将dll及其清单文件下载到某个版本 没有注册的目录。
然后我创建一个指向该目录的激活上下文 然后从dll创建类的实例。
让我们说创建A类,然后在B类之后。
在这个流程中一切顺利。
当我将我的应用程序更改为WinForm时,问题就出现了。 当按下“按钮1”时,我像以前一样创建激活上下文,然后创建A类的实例。 这很好用,流程返回到我的WinForm。 但是当按下“按钮2”时,我无法创建B类。 我得到一个例外,说无法找到班级!
所以似乎WinForm以某种方式弄乱了我的激活上下文。
为什么?那里发生了什么?
有办法吗?
很少注意到:
我尝试使用sxstrace.exe执行激活上下文创建,但是它仅记录了我的激活上下文创建。
我尝试评论出Application.EnableVisualStyles(),但没有帮助。
如果我使用create并销毁激活上下文将每个调用包装到我的dll,它可以工作但我自然不想去那里...
答案 0 :(得分:1)
CLR不保证在传递托管代码时维护/保留Win32激活上下文。
解决方法是调用本机代码,在其中设置激活上下文,执行您需要的操作,然后还原上下文。你可能只需要它来加载和绑定到对象,所以一旦你有了IUnknown,你就可以返回它。
马丁