C# 是否有可能反映csproj组件参考的细节?

C# 是否有可能反映csproj组件参考的细节?,c#,reflection,reference,assemblies,C#,Reflection,Reference,Assemblies,我们经常遇到问题,因为我们的解决方案中的项目/包引用配置错误(例如,不正确地要求特定版本)。我想写一个简单的NUnit测试来检查这类情况,这样我们就可以及早发现它们。理想情况下,我会在程序集上使用反射,而不是自己解析csproj文件。这可能吗?csproj文件中的所有信息能否通过对已编译程序集的反射来获取?您可以通过调用assembly.getReferencedAssemblys来获取特定程序集的引用,该程序集将返回引用的程序集名称。这包括名称和版本 Assembly a = Assembly

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

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

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

您无法从已编译的输出程序集中获取该信息,但可以使用Microsoft.Build命名空间遍历项目文件…您是否有权访问csproj文件?编译时,.csproj文件中存储的某些详细信息将丢失,但您应该能够获取所有引用的程序集及其版本。这就足够了吗?在@JerKimball的注释上展开,看看.Derp-当然:@ChaseMedallion如果您只需要引用的程序集,这应该可以为您完成。假设
.csproj
文件包含实际未使用的引用。就像它引用的是
System.Data
程序集,但实际上没有使用该程序集中的任何内容(没有类、结构、接口、枚举或委托类型)。在这种情况下,
getReferenceAssemblys()
是否返回
System.Data
assembly?但版本是加载的实际程序集的版本还是引用指定的版本?如果引用没有指定版本怎么办?