我正在使用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的情况下传入System
或mscorlib
只会返回null。
如何才能从单词System
获取System
的完整类型名称以及.csproj文件中的其他信息?
答案 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负责运行时加载逻辑。