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 对象的主要内容,如果未能解决你的问题,请参考以下文章

vue中注册组件

vue全局组件局部组件的使用

Silverlight 可以与 MIDI 乐器通信吗?

能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么

vue使用template注册组件,组件怎么获得实例数据

vue 组件 全局注册和局部注册