以编程方式从本地 Nuget 包文件加载程序集

Posted

技术标签:

【中文标题】以编程方式从本地 Nuget 包文件加载程序集【英文标题】:Programmatically Load Assembly From Local Nuget Package File 【发布时间】:2021-02-18 02:01:21 【问题描述】:

在我的本地文件系统上,我有 nuget 包 foo.nupkg。它包含程序集foo.dll

如果我手动提取foo.nupkg,我可以按如下方式以编程方式加载foo.dll 程序集:

AssemblyLoadContext.Default.LoadFromAssemblyPath("c:/path/foo.dll");

如何直接从foo.nupkg 加载程序集?

我已经尝试过的:

当然,我可以通过编程方式将.nupkg 文件提取到一个临时目录,但我想知道这是否真的需要。 我尝试使用包NuGet.Core。我提供了一个接受IPackagePackageManager#InstallPackage。但似乎 IPackage 实例只能从存储库(我没有)中检索。

【问题讨论】:

【参考方案1】:

nuget 包只是一个 zip 文件,因此您可以简单地使用 System.IO.Compression.ZipArchive 来读取它。

您还可以从字节数组加载程序集,所以这样的事情应该可以工作(假设 newtonsoft.json 包在工作目录中):

using var archive = ZipFile.OpenRead("newtonsoft.json.12.0.3.nupkg");
var entry = archive.GetEntry("lib/netstandard2.0/Newtonsoft.Json.dll");

using var target = new MemoryStream();

using var source = entry.Open();
source.CopyTo(target);

var assembly = Assembly.Load(target.ToArray());
var type = assembly.GetType("Newtonsoft.Json.JsonConvert");
Console.WriteLine(type.FullName);

【讨论】:

以上是关于以编程方式从本地 Nuget 包文件加载程序集的主要内容,如果未能解决你的问题,请参考以下文章

4.10使用NuGet包参考的插件不能正确部署

无法加载文件或程序集'Ninject 版本 4.0.0.0

vs2013怎么关闭nuget程序包预加载

创建的 NuGet 包没有任何编译时程序集

无法加载文件或程序集“System.Runtime.InteropServices”

运行 OctoPack 以创建包含 DEBUG 程序集的 nuget 包