【问题标题】:C# - How to load dll at runtime in WinRT universal applicationC# - 如何在 WinRT 通用应用程序中运行时加载 dll
【发布时间】:2015-02-22 19:39:17
【问题描述】:

在 .Net 中有 System.Reflection.Assembly.LoadFrom("File location") 和 System.Reflection.Assembly.LoadFile("File location")。在 WinRT 中只有 System.Reflection.Assembly.Load(System.Reflection.AssemblyName)。 那么如何在 WinRT 中加载 dll 文件呢?

【问题讨论】:

  • 首先,答案中的博客 URL 已过时。其次,我在应用程序在运行时下载和运行 dll 之前看到过它,但我不知道它是如何完成的。也许这在 WinRT 之前是被禁止的,然后在对其进行更新后被允许,尤其是在 4 年前提出这个问题!
  • 对不起,一个重复的问题...仍然是一个重复的问题。如果您认为您的问题不是重复的,请更新您的帖子并说明为什么它不是重复的。顺便说一句,另一篇文章中的过时链接已经更新,现在可以使用了。

标签: c# dll reflection windows-runtime windows-applications


【解决方案1】:

从我在互联网上阅读的所有内容来看,即使在 UWP 中,这仍然是不可能的。

我在这里创建了一个功能请求: https://wpdev.uservoice.com/forums/110705-universal-windows-platform/suggestions/18145291-dynamically-load-assembly

如果您对此功能投赞成票,我们将不胜感激。同时,我认为除了将 DLL 包含在 AppX 包中(这是没用的)之外,这个问题没有答案。

【讨论】:

  • DLL 必须在你的包中,这样静态分析才能验证你没有调用任何 UWP 应用中不允许的函数。
  • 这是微软的标准克制。但这没有任何意义。作为运行时环境的 UWP 根本没有“不允许”的 API。他们只是被排除在外。因此,例如,如果 DLL 中包含具有“不允许的”API 的 DLL,Windows UWP 根本无法运行它们。 UWP 是个大男孩,它可以在运行时扫描程序集以确保支持 API。但即使这样也太过分了。其他 .NET 平台只是抛出“找不到方法”的异常。微软不愿允许这样做是非常令人费解的。他们真的想要构建应用吗?
  • 一个DLL可能只存在于PC上,不存在于Phone上,这使得它不具有通用性。并且在运行时扫描程序集还不够好,因为程序集可能会进行内存扫描以查找要调用的函数,而不是使用 GetProcAddress。当然,如果您不喜欢该政策,您可以绕过所有政策并仅旁加载您的应用。
  • “DLL 可能只存在于 PC 上而不存在于手机上” - 那又怎样?开发人员有责任确保 DLL 在所有位置都可用。如果文件是文本文件或图像,则相同。 “程序集可能会进行内存扫描以查找要调用的函数,而不是使用 GetProcAddress”。你在那个问题上失去了我。这甚至意味着什么?
  • 程序可以手动解析图像元数据以找到它想要的功能,而不是使用 GetProcAddress。 Store 希望能够清点程序使用的 API,以便它可以验证,例如,它没有调用任何未记录的函数,并且如果发现程序做错事,该程序永远不会进入 Store首先。 (但正如我所指出的,这是商店政策。如果您不喜欢商店政策,请不要通过商店。只需自行加载即可。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
相关资源
最近更新 更多