0

我们正在尝试使用激活上下文 API 在 IE 中运行的 SilverLight 5.0 组件中加载一个 COM 可见的 .NET 对象,而无需注册。 http://msdn.microsoft.com/en-us/library/ms973913.aspx

SilverLight 组件在浏览器中作为受信任的应用程序运行,如http://msdn.microsoft.com/en-us/library/gg192793(v=vs.95).aspx中所述。

可以使用激活上下文 API 将对象加载到独立的测试应用程序中,以便正确形成清单。在浏览器内运行的 SiverLight 中,组件加载器 DLL(从 AppData/LocalLow 加载)成功创建并激活了激活上下文,但无法从 AppData/LocalLow 加载 COM 可见的 .NET 对象 DLL。结果总是“找不到文件”。

有没有人在类似设置中使用 SilverLight/COM 的经验?

TIA

4

1 回答 1

0

我向 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 互操作,它会忽略根清单路径。

我希望这对将来的某人有所帮助。

于 2013-08-21T13:31:24.267 回答