1

我正在使用 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. 但是传入Systemmscorlib不传入 publickey 只会返回 null。

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

4

1 回答 1

1

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

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

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

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

于 2012-10-14T23:55:57.420 回答