【问题标题】:Is it possible to reflect over the details of csproj assembly references?是否可以反映 csproj 程序集引用的细节?
【发布时间】:2013-03-06 21:15:22
【问题描述】:

我们经常遇到麻烦,因为我们解决方案中的项目/包引用配置错误(例如,不正确地需要特定版本)。我想编写一个简单的 NUnit 测试来检查这些情况,以便我们尽早发现它们。理想情况下,我会在程序集上使用反射,而不是自己解析 csproj 文件。这可能吗? csproj文件中的所有信息都可以通过编译后的程序集反射获得吗?

【问题讨论】:

  • 您无法从已编译的输出程序集中获取该信息,但您可以使用 Microsoft.Build 命名空间遍历项目文件...您可以访问 csproj 文件吗?
  • .csproj 文件中存储的一些详细信息在编译时会丢失,但您应该能够获取所有引用的程序集及其版本。这样就够了吗?
  • 扩展@JerKimball 的评论,看看Microsoft.Build.Evaluation.Project class

标签: c# reflection reference assemblies


【解决方案1】:

您可以通过调用Assembly.GetReferencedAssemblies 来获取特定程序集的引用,这将返回被引用的AssemblyName。这包括名称和版本。

Assembly a = Assembly.ReflectionOnlyLoadFrom(fileName);
var references = a.GetReferencedAssemblies();

【讨论】:

  • Derp - 当然:@ChaseMedallion 如果您所追求的只是引用的程序集,这应该为您完成。
  • 假设.csproj 文件包含实际未使用的引用。就像它引用 System.Data 程序集一样,但实际上没有使用该程序集中的任何内容(没有类、结构、接口、枚举或委托类型)。在这种情况下GetReferencedAssemblies() 会返回System.Data 程序集吗?
  • 但是版本是加载的实际程序集的版本还是引用指定的版本?如果引用没有指定版本怎么办?
猜你喜欢
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 2012-04-12
  • 2011-10-16
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
相关资源
最近更新 更多