【问题标题】:.NET Core 2.x Load Referenced Assemblies, that have no type references in code.NET Core 2.x 加载引用的程序集,在代码中没有类型引用
【发布时间】:2019-11-16 22:00:13
【问题描述】:

我有一个 .NET Core 2.2 项目 A,它具有对程序集 BC包引用。 (基本上是 NuGet 引用的 dll)

我需要在运行时动态加载 BC,但是我似乎找不到任何关于如何实现这一点的文档。

很多帖子都提到通过Assembly.GetExecutingAssembly().GetReferencedAssemblies() 对所有引用的程序集调用Assembly.Load(),但这只会检索程序集,在执行程序集的代码中明确引用了它们的某些类型

这对我不起作用,因为我的代码中没有对它们类型的任何引用。

我发现您可以通过 Assembly.ReflectionOnlyLoad() 获取引用程序集的完整列表,但是 .NET Core 运行时不支持此操作

我尝试搜索 AppDomainAssemblyLoadContext 类,以找到此类信息,但找不到任何有用的信息。

总结一下,我的问题是如何动态加载程序集的引用程序集,而不在我的代码中显式地触及它们的某些类型

【问题讨论】:

  • 您的应用是否有要加载的程序集名称列表?还是所有程序集都在同一个文件夹中?
  • @DavidBrowne-Microsoft 我的问题是获取该列表。我想加载程序集,这些程序集设置为对我正在执行的程序集的包引用。但是我没有办法获得它。如果我能找到获取它们的方法,我可能可以通过 Assembly.Load() 加载它们
  • 未使用的引用将在编译时被优化。创建一个新项目,添加一个随机 nuget 包,编译,您将不会在输出文件夹中找到 nuget .dll,生成的程序集也不包含元数据级别的外部程序集引用。
  • 好吧,抓住ildasm 自己看看,但即使发布的程序集也不包含引用未使用的外部程序集的单个字节:i.imgur.com/MbdaQrF.png

标签: c# .net dynamic reflection .net-assembly


【解决方案1】:

我找到了解决方案,我希望这就是你想要的。

你可以制作一个窗口应用程序来为你做这件事。 将此包添加到您的项目中:

Install-Package NuGet.Core -Version 2.14.0

之后:

private void button1_Click(object sender, EventArgs e)
{
    string packageID = "Newtonsoft.Json"; // Use your package name
    IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository("https://packages.nuget.org/api/v2");
    var version = repo.FindPackagesById(packageID).Max(p => p.Version);

    string path = "D:\\MyPackages"; // Use your path
    PackageManager packageManager = new PackageManager(repo, path);
    packageManager.InstallPackage(packageID, SemanticVersion.Parse(version.ToString()), true, false);
}

点击按钮后,包已经下载完毕。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2021-06-04
  • 2018-07-16
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多