使用NRefactory解析.csproj文件中的引用

时间:2012-10-14 11:58:09

标签: c# types assemblies csproj nrefactory

我正在使用NRefactory尝试解析.csproj文件中列出的所有编译文件,并希望能够解析项目中的所有类型。

虽然我没有添加.csproj也包含的程序集引用,但是我无法解析所有类型,这正是我所挣扎的。

摘录自.csproj:

<ItemGroup>
    <Reference Include="Microsoft.Xna.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
    <Reference Include="Microsoft.Xna.Framework.Game, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
    <Reference Include="mscorlib" />
    <Reference Include="System" />
    <Reference Include="System.Xml" />
    <Reference Include="System.Core" />
</ItemGroup>

可以看出,XNA引用提供了一个全名,因此我可以使用Type.GetType("fullname").Assembly轻松获取它们的程序集。但是,在没有publickey的情况下传入Systemmscorlib只会返回null。

如何才能从单词System获取System的完整类型名称以及.csproj文件中的其他信息?

1 个答案:

答案 0 :(得分:1)

您确实要加载哪个System.dll副本?一个在运行时可用的?或者是C#编译器使用的那个?

如果项目以.NET 4.0为目标,则C#编译器使用与针对.NET 4.5的项目不同的引用程序集。但是,在运行时,两者都使用相同的程序集(因为.NET 4.5安装会覆盖.NET 4.0)。

要获得与C#编译器相同的版本,最好的解决方案是让MSBuild(通过Microsoft.Build.dll)解析程序集引用。 NRefactory CodeProject article上的示例应用程序使用此方法,可以从那里复制代码。

通常无法获得正确的运行时程序集,因为应用程序可以重新配置程序集的加载方式(app.config或AppDomain.AssemblyResolve事件处理程序)。但是,一个很好的近似可能是使用MSBuild来确定完整的程序集名称,然后将其传递给Assembly.Load()以让.NET负责运行时加载逻辑。