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。ただし、公開鍵を渡すSystemかどうかmscorlibにかかわらず、nullが返されます。

.csprojファイルにあるSystem単語やその他の情報から完全なタイプ名を取得するにはどうすればよいですか?System

4

1 に答える 1

1

System.dllのどのコピーを実際にロードしますか?実行時に使用できるものは?または、C#コンパイラで使用されるものですか?

プロジェクトが.NET4.0を対象としている場合、C#コンパイラは.NET4.5を対象としているプロジェクトとは異なる参照アセンブリを使用します。ただし、実行時には、両方が同じアセンブリを使用します(.NET4.5インストールは.NET4.0を上書きするため)。

C#コンパイラで使用されているものと同じバージョンを取得するには、MSBuildに(を介してMicrosoft.Build.dll)アセンブリ参照を解決するように依頼するのが最善の解決策です。NRefactoryCodeProjectの記事のサンプルアプリケーションはこのアプローチを使用しています。そこからコードを自由にコピーしてください。

アプリケーションはアセンブリのロード方法(app.configまたはAppDomain.AssemblyResolveイベントハンドラー)を再構成できるため、通常、正しいランタイムアセンブリを取得することは不可能です。ただし、完全なアセンブリ名を決定するためにMSBuildを使用し、それをに渡してAssembly.Load().NETに実行時の読み込みロジックを処理させるのが適切な概算です。

于 2012-10-14T23:55:57.420 に答える