SilverLight 组件能否实例化免注册的 COM 可见 .NET 对象
Posted
技术标签:
【中文标题】SilverLight 组件能否实例化免注册的 COM 可见 .NET 对象【英文标题】:Can a SilverLight component instantiate a registration-free COM-visible .NET object 【发布时间】:2013-08-11 20:13:31 【问题描述】:我们正在尝试使用激活上下文 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
【问题讨论】:
【参考方案1】:我向 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 互操作,它会忽略根清单路径。
我希望这对将来的人有所帮助。
【讨论】:
以上是关于SilverLight 组件能否实例化免注册的 COM 可见 .NET 对象的主要内容,如果未能解决你的问题,请参考以下文章