Сводка:
Нам нужно продублировать поведение диалогового окна Добавить ссылку, используя DTE, когда вы добавляете конкретную DLL (она добавляет запись пути подсказки к ссылке в файле CSProj).
** Примечание: есть еще один связанный, но не дублированный, пост от меня здесь: https://stackoverflow.com/questions/6690655/visual-studio-2010-add-in-how-to-get-a-references-hint-path-property Пожалуйста, прочитайте его также для получения дополнительной информации об этой проблеме.Теперь я добавил достойную награду, чтобы получить ответ на этот вопрос, и с радостью распределю голоса за любые приличные ответы:) *
История на данный момент:
Я конвертирую ссылку на проектк прямой ссылке на DLL программно с использованием DTE.
Если у меня есть простое решение с Project2
(проект parent ), которое ссылается на Project1
(проект child ), я внесу изменениенапример:
project1Reference = FindProjectReference(project2.References, project1);
project1Reference.Remove();
Reference dllReference = project2.References.Add(project1DllPath);
, где project1DllPath ссылается на файл "c:\somewhere\Project1\Bin\Debug\Project1.dll"
.
Проблема, которую я пока не могу решить, состоит в том, что новая ссылка не - "c:\somewhere\Project1\Bin\Debug\Project1.dll"
но вместо этого указывает на "c:\somewhere\Project2\Bin\Debug\Project1.dll"
(и файл копируется туда).
Если я добавляю DLL напрямую / вручную с помощью меню Добавить ссылку, это не делает это копирование.
Как добавить ссылку на DLL в библиотеку DLL существующего проекта без ее копирования и ссылки на нее вместо этого?
Я пытался добавить dllReference.CopyLocal = false;
после добавления, но помимо установки флагаэто не имело никакого значения.Кажется, что нет никаких вариантов изменить путь после создания.
Обновление: я также попытался программно удалить любую зависимость Build от Project1 из Project2, но это не имело никакого эффекта.Разница между файлами csproj:
Как проект:
<ItemGroup>
<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj">
<Project>{86B3E118-2CD1-49E7-A180-C1346EC223B9}</Project>
<Name>ClassLibrary1</Name>
</ProjectReference>
</ItemGroup>
В качестве ссылки на DLL (путь был полностью потерян):
<ItemGroup>
<Reference Include="ClassLibrary1, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
...
</ItemGroup>
В качестве DLL-библиотеки, на которую ссылаются вручную:
<ItemGroup>
<Reference Include="ClassLibrary1, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\ClassLibrary1\bin\Debug\ClassLibrary1.dll</HintPath>
</Reference>
...
</ItemGroup>
Похоже, возможность указать путь подсказки для ссылки на DLL - это ключ. Как задать путь подсказки для ссылки DLL (при условии, что у вас есть только дескриптор свойства Reference)?
Дополнительная информация (20 июля 2011 г.):
Предложение из Muse VSExtensions ниже не влияет на рассматриваемые библиотеки DLL, так как уже была сделана копия из проекта BIN библиотеки DLL в папку BIN родительского проекта.Родительский проект не использует ссылочный путь, поскольку в его выходной папке уже есть дочерняя DLL.
Также Reference Paths
проекта сохраняются в проекте Файл .csproj.user, а не файл проекта .csproj.