2016-04-12 16 views
1

Мне нужно заставить все мои проекты использовать dll's, которые хранятся в общем месте. Я начинаю с реорганизации существующих проектов, чтобы указать на исходную папку dll's по моему предпочтению. Поэтому я решил попробовать программный способ изменения этих ссылок.Программно модифицировать ссылки DLL внутри файла проекта

Я прочитал dll ссылки следующим образом:

XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003"; 
      XDocument projDefinition = XDocument.Load(filePath); 
      IEnumerable<string> references = projDefinition 
       .Element(msbuild + "Project") 
       .Elements(msbuild + "ItemGroup") 
       .Elements(msbuild + "Reference") 
       .Elements(msbuild + "HintPath") 
       .Select(refElem => refElem.Value); 

Следующим шагом является изменение ссылки HintPath на основе имени ссылки. Я планирую создать словарь ссылок, а затем пропустить их для обновления каждого из файлов проекта.

Однако я не могу найти твердый способ считывания и изменения HintPath на основе Reference внутри csproj.

+0

Проверьте этот ответ на подобный вопрос: http://stackoverflow.com/a/35233082/33082 –

+0

Ответ показывает именно то, что я делаю, плюс он сваливает на ссылку, читался в формате TXT. Не очень полезно. Мне нужно изменить HintPath на основе ссылки. – eYe

ответ

0

Я, скорее всего, довольно поздно, и я еще должен проверить это приложение, но вы должны иметь возможность взять код, который у вас есть, и удалить .Select(refElem => refElem.Value) перед повторением ссылок.

Это даст вам доступ к самому элементу и позволит обновить значение для элемента. После того, как вы изменили все значения, которые вам нужны, вы можете записать XMLdoc обратно в файл proj.

XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003"; 
     XDocument projDefinition = XDocument.Load(filePath); 
     IEnumerable<string> references = projDefinition 
      .Element(msbuild + "Project") 
      .Elements(msbuild + "ItemGroup") 
      .Elements(msbuild + "Reference") 
      .Elements(msbuild + "HintPath"); 
     foreach(var element in references) 
     { 
      // do what you need to in order to update the reference 
     } 
     projDefinition.Save(filePath);