【问题标题】:How to load/import dll with MEF out of metro app?如何从 Metro 应用程序中使用 MEF 加载/导入 dll?
【发布时间】:2012-03-12 14:37:00
【问题描述】:

我正在尝试使用 MEF 编写一个可扩展的 Metro 应用程序。我让它与本地扩展一起工作(在当前程序集中)。现在我想加载一个外部 dll。 DirectoryCatalog 似乎不存在于 .net 4.5 中。所以我尝试使用ApplicationCatalog,但在调用SatisfyImportsOnce时出现以下错误:Assembly.LoadFrom is not supported in AppX.

这是我的代码:

var catalog = new AssemblyCatalog(GetType().GetTypeInfo().Assembly);
ApplicationCatalog catApp = new ApplicationCatalog();
AggregateCatalog cat = new AggregateCatalog(catalog, catApp);
_compositionService = cat.CreateCompositionService();
_compositionService.SatisfyImportsOnce(this);

有什么建议吗?

我已将 dll 放在 Appx 目录中,并以管理员身份运行 VS11 Beta。

【问题讨论】:

    标签: c# mef microsoft-metro windows-runtime .net-4.5


    【解决方案1】:

    您的外部库超出了 Metro 允许的沙箱。 Metro 环境中的 .NET 框架是有限的,类似于 WP7 或 Micro Framework。有很多东西被剪掉了。如果您的外部 DLL 不是使用那些受约束的库构建的,那么编译器将不允许使用它。

    【讨论】:

    • 我为 dll 创建了作为 Windows Metro 风格类库的项目。
    • 哦,对不起,我错过了。您是否将输出设置为 WinMD 文件? sempf.net/post/…
    • 不,我没有,因为 WinMD 文件只允许实现 WinRT 接口。但是我的类实现了核心项目的 IExtension 接口(请参阅链接文章中的最后一句话)。我想我需要这个接口来导入/导出,还是我错过了其他方法?
    • 确实如此,但这又回到了我原来的答案——你不能走出 MetroUI 的沙箱。他们使用 WinMD 格式强制执行此操作。要在 MetroUI 中使用该库,它必须是 WinMD。要成为 WinMD,您必须只实现允许的接口。这就是 MetroUI 应用程序的 catch22。你不能使用大量的外部代码,即使它是良性的。
    • 本周早些时候我在另一个答案中遇到的一些文件缓存存在问题 - 可能尝试执行清理和构建或手动删除临时文件。
    【解决方案2】:

    我在 MEF 论坛上与一些支持者交谈,他确认 ApplicationCatalog 不能在 Metro 应用程序之外使用。所以这个问题无法解决,但可以关闭。 Source Thread

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多