我向 Microsoft 提交了一张票,建议的解决方案是实际激活上下文错误的解决方法。
//Create your own activation context pointing to the manifest
ACTCTX actCtx;
ULONG_PTR pCtxCookie;
//initialize actCtx with your manifest name and path
....
HANDLE hActCtx = CreateActCtx(&actCtx);
ActivateActCtx(hActCtx, &pCtxCookie);
....
//surround EVERY CALL to CreateInstance with the null activation context, otherwise you will get an error on DeactivateActCtx!!!
ULONG_PTR cookie; //do not reuse the pCtxCookie!!!
ActivateActCtx(NULL, &cookie);
HRESULT hr = classA.CreateInstance(__uuidof(SxSNET::SxSClass));
DeactivateActCtx(0, cookie); //deactivate the null context
...
//deactivate and deallocate your actual manifest based activation context
DeactivateActCtx(0, pCtxCookie);
ReleaseActCtx(hActCtx);
该解决方案不起作用。此解决方案的问题在于,空上下文强制绑定到 .NET 程序集的注册版本,而不是使用隔离上下文的版本。调用 .NET 程序集时,无注册 COM 中存在错误,因为绑定搜索逻辑根本不查看清单位置,而只查看 GAC 和进程的 bin 路径。
据微软称:
发生此错误是因为对定义和实现托管 COM 组件的 .NET 程序集进行融合探测失败。.NET 运行时仅探测与可执行路径或全局程序集缓存相关的文件。对于 Reg-Free 托管 COM 互操作,它会忽略根清单路径。
我希望这对将来的某人有所帮助。