2012-10-14 22 views
1

我正在使用NRefactory嘗試解析.csproj文件中列出的所有編譯文件,並且希望能夠解析項目中的所有類型。使用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這個單詞以及.csproj文件中存在的其他信息中獲得System的完整類型名稱?

回答

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處理運行時加載邏輯。

相關問題