是否可以在网络核心中加载平台特定的.net库?

时间:2018-04-05 15:20:48

标签: c# reflection .net-core cross-platform

我的目标是创建一个插件类型结构,我的net core 2.0库试图通过反映文件夹中的库来加载未知(直到运行时)类型。

其中一些类型可能需要特定于平台的实现。 我通过动态加载.net框架4.6.1库(后者依赖于System.Windows.Forms)尝试了这一点,但是当代码尝试在成功构造的类型上调用方法时,我收到以下异常:

  

无法加载文件或程序集'System.Windows.Forms,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'。不应加载引用程序集以执行。它们只能在Reflection-only loader上下文中加载。 (HRESULT异常:0x80131058)

阅读MSDN它表明必须将依赖System.Windows.Forms.dll加载到错误的上下文中?

第一个问题,是否有一些简单的事情我需要改变以使其发挥作用? 其次,这种事情甚至可能吗? (将核心与平台特定库混合)
有没有更好的方法来做这个我不知道的事情?谷歌正在提出有限的文件。

4 个答案:

答案 0 :(得分:1)

不,从.Net Core加载.Net Framework程序集将无效。

  

Windows Forms和WPF将永远保留在.Net Framework中,因为Windows Universal应用程序已成为新的UI信条。任何依赖于平台特定功能的内容也将被排除在外。    - Ben Morris

.Net Core和.Net Framework程序集是不同的,不能相互交互。

因此,您的插件系统只能加载.Net Core或.Net Standard程序集。如果您确实需要.Net Framework支持(或其他语言),您可以通过Process.Start()与插件进行交互,并通过stdin / runtime参数传递参数。

答案 1 :(得分:0)

我建议最初加载所有DLL库。 然后在加载所有DLL之后调用方法。

如果收到错误消息“无法加载文件或程序集***”,请找到并将该DLL库添加到DLL库文件夹中。

下次编译并运行应用程序时,它将加载缺少的库,并且在调用方法时不应该抱怨。

我已成功完成此操作。粘贴您的代码以获得更多建议。

答案 2 :(得分:0)

.NET Framework通过全局程序集缓存(GAC)支持此功能。 .NET Framework知道要查看GAC并遵循任何程序集重定向并加载所需的最新安装的兼容版本的程序集。

据我所知,.NET Core并非如此。您可以使用最近的Framework Dependent Deployment

我不确定当您尝试在.NET Core环境中加载.NET Framework程序集时会发生什么,但我认为它不受支持。例如,我认为System.Windows.Forms不是.NET Core或.NET Standard 2.0的一部分。所以我想我的回答你的问题是否定的。 This post by Scott Hanselman可能会帮助您更好地了解问题。 .NET Standard的存在允许您构建可以在.NET Core OR .NET Framework或Xamarin上运行的库,每个库都是一个单独的运行时。

需要同时使用.net core&必须明确编译.net框架才能这样做(通过.NET Standard,它以公共子集为目标)。运行时基本上是不同的,并且不兼容。下面是另一个链接,列出了您必须克服的一些不兼容性:docs.microsoft.com/en-us/dotnet/core/porting/libraries ...在两个运行时中只能加载.NET标准库。您将能够动态加载.net核心& .net标准库,但不是.NET框架库,因为代码可以使用.NET核心不支持的功能。

答案 3 :(得分:0)

您可以从磁盘加载程序集,但是,您将面临一些问题。

  1. 仅仅因为它兼容并不能使它成为正确的装配,你也需要正确的版本

  2. 您打开一个主要的安全问题,因为有人可能会注入一个不属于“你自己”的DLL

  3. 您可能需要以正确的顺序加载相关的程序集。

  4. 幸运的是,在部署应用程序并查看[Application-Name] .deps.json时,您已经有了一个可以实现的解决方案,可以在Core中查看各种依赖注入框架。 ,这是一个文本文件,通知运行时要加载的内容。

    更新文本文件很简单,其余的是框架魔术; - )