是否可以反映csproj程序集引用的细节?

问题描述:

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

+0

您无法从编译后的输出程序集中获取该信息,但可以使用“Microsoft.Build”命名空间来执行项目文件......您是否可以访问csproj文件? – JerKimball 2013-03-06 21:19:37

+0

编译时,存储在.csproj文件中的一些细节会丢失,但您应该能够获取所有引用的程序集及其版本。这足够吗? – driis 2013-03-06 21:19:40

+0

扩展@ JerKimball的评论,看看['Microsoft.Build.Evaluation.Project'类](http://msdn.microsoft.com/en-us/library/microsoft.build.evaluation.project.aspx )。 – 2013-03-06 21:28:04

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

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

Derp - 当然:@ChaseMedallion如果你以后所有的东西都是引用的程序集,这应该为你做。 – JerKimball 2013-03-06 21:30:39

+0

假设'.csproj'文件包含实际未使用的引用。就像它引用'System.Data'程序集一样,但实际上却没有任何东西(没有类,结构,接口,枚举或委托类型)。在这种情况下'GetReferencedAssemblies()'返回'System.Data'程序集吗? – 2013-03-06 21:39:43

+0

但是版本是否是实际装配的版本或者参考指定的版本?如果引用没有指定版本会怎么样? – ChaseMedallion 2013-03-06 21:43:21