Как MonoDevelop считывает .pc-файлы?

Разработка на C# под linux
 
Хорошо бы тайти тот код, где monodevelop считывает .pc-файлы.
Ну, есть диалог добавления references, оттуда где-то что-то как-то вызвается, чтобы составить список на вкладке packages
packages.png
можно разобраться как работает тот код (сколько на это уйдёт времени?)
Как monodevelop заполняет эту кладку, когда monodevelop заполняет эту вкладку - при каждом открытии или при старте IDE ?
cd /var/calculate/remote/distfiles/egit-src/monodevelop.git
grep -R -n "Edit References"
main/src/core/MonoDevelop.Ide/ExtensionModel/Commands.addin.xml, line 238
main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.SelectReferenceDialog.cs, line 44
this.Title = global::Mono.Unix.Catalog.GetString ("Edit References");

main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs:73
main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs:859
main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/SelectReferenceDialog.cs:1
main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/PackageReferencePanel.cs:55
main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/ProjectReferencePanel.cs:201
main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/AssemblyReferencePanel.cs:49

https://github.com/mono/monodevelop/blob/master/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/AssemblyReferencePanel.cs

class AssemblyInfo
{
	public AssemblyInfo (FilePath file)
	{
		this.File = file.CanonicalPath;
		try {
			Version = new AssemblyName (SystemAssemblyService.GetAssemblyName (file)).Version.ToString ();
		} catch {
			Version = "";
		}
	}
	
	public FilePath File;
	public string Version;
	public bool Selected;
}

List<AssemblyInfo> assemblies = new List<AssemblyInfo> ();
Тут мы не видим, откуда берутся имена файлов (берутся они из проекта, списка недавно использованных файлов и из диалога открытия файла)

Но нам нужна не эта вкладка диалога

ListStore store = new ListStore (typeof (string), typeof (string), typeof (SystemAssembly), typeof (bool), typeof (string), typeof (string), typeof(IconId), typeof(int), typeof(ReferenceType));
treeView = new TreeView (store);
store.InsertWithValues (-1,
name,
version,
systemAssembly,
selected,
systemAssembly.FullName,
pkg,
MonoDevelop.Ide.Gui.Stock.Package,
matchRank,
ReferenceType.Package);
(казалось бы, зачем TreeView, если нужен список с галочками?)

foreach (SystemAssembly systemAssembly in targetContext.GetAssemblies (targetVersion))
IAssemblyContext targetContext
SetTargetFramework (netProject.AssemblyContext, netProject.TargetFramework);

Итак, где-то в объекте проекта (который .csproj) хранится список сборок для фреймворка этого проекта.
И если посмотреть, где устанавливается фреймворк проекта, наверное с того места можно найти где заполняется список сборок.
Смущает то, что сборки должны быть привязаны к какому-то фреймворку (раньше так не было?)
framework.png
В принципе, то что сборка может требовать какую-то определённую платформу - это нормально. У неё для этого есть манифест, в котором прописаны все требуемые версии.
grep -R -n "Use MSBuild build engine" | grep -v "\.po"
main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/CombineMSBuildOptions.cs:55
main/src/addins/CSharpBinding/MonoDevelop.CSharp.Project/CSharpCompilerParameters.cs:180
https://github.com/mono/monodevelop/blob/master/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.OptionPanels/RuntimeOptionsPanel.cs#L76
readonly List<TargetFramework> frameworks;
frameworks = Runtime.SystemAssemblyService.GetTargetFrameworks ()
	.Where (fx => !fx.Hidden && project.TargetRuntime.IsInstalled (fx) && project.SupportsFramework (fx))
	.ToList ();
...
project.TargetFramework = frameworks [runtimeVersionCombo.Active];

SystemAssemblyService

https://github.com/mono/monodevelop/blob/master/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/SystemAssemblyService.cs

Dictionary frameworks;
public IEnumerable GetTargetFrameworks ()
{
    return frameworks.Values;
}

foreach (TargetFrameworkNode node in AddinManager.GetExtensionNodes ("/MonoDevelop/Core/Frameworks")) {
    TargetFramework fx = node.CreateFramework ();

В общем, знание фреймворка тут как-то сбоку. Над осмотреть где считывается AssemblyContext

AssemblyContext

https://github.com/mono/monodevelop/blob/master/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/AssemblyContext.cs
Есть пять классов - SystemPackage, SystemAssembly, SystemPackageInfo, PackageAssemblyInfo, LibraryPackageInfo
В SystemPackage есть коллекция Assemblies (это говорит нам о том, что Package это что-то такое, внутри чего есть несколько сборок)
У класса AssemblyContext есть метод RegisterPackage

https://github.com/mono/monodevelop/blob/master/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/DirectoryAssemblyContext.cs#L100-L107
void RegisterPcFile (string file)
{
	LibraryPackageInfo pinfo = MonoTargetRuntime.PcFileCache.GetPackageInfo (file);
	if (pinfo.IsValidPackage) {
		SystemPackage sp = RegisterPackage (pinfo, true);
		packages.Add (sp);
	}
}


Список директорий, откуда считывать .pc-файлы берется из переменной окружения ${PKG_CONFIG_PATH}
https://github.com/mono/monodevelop/blob/master/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntime.cs#L208-L222
private void ParsePCFile (string pcfile)
{
	// Don't register the package twice
	string pname = Path.GetFileNameWithoutExtension (pcfile);
	if (RuntimeAssemblyContext.GetPackageInternal (pname) != null || IsCorePackage (pname))
		return;

	LibraryPackageInfo pinfo = PcFileCache.GetPackageInfo (pcfile);
	if (pinfo.IsValidPackage)
		RuntimeAssemblyContext.RegisterPackage (pinfo, false);
}
https://github.com/mono/monodevelop/blob/master/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/PcFileCache.cs#L143-L175
https://github.com/mono/monodevelop/blob/master/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/PcFileCache.cs#L143-L175
TP ParsePackageInfo (string pcfile)
{
    PcFile file = new PcFile ();
    file.Load (pcfile);
    ...
public void PcFile.Load (string pcfile)
такой же код как в monodevelop есть и в самом mono
https://github.com/mono/mono/blob/master/mcs/class/Mono.XBuild.Tasks/Mono.XBuild.Tasks/PcFileCache.cs
Вопрос - почему его не вынесли в отдельный проект? Ну возьми и вынеси...