概括:
当您添加特定的 DLL 时,我们需要使用 DTE 复制“添加引用”对话框的行为(它在 CSProj 文件中的引用中添加了一个提示路径条目)。
**注意:我在这里发布了另一个相关但不重复的帖子:https ://stackoverflow.com/questions/6690655/visual-studio-2010-add-in-how-to-get-a-references-提示路径属性有关此问题的更多信息,另请阅读该内容。我现在已经添加了一个体面的赏金来得到这个答案,并且很乐意对任何体面的答案进行投票:)*
到目前为止的故事:
我正在使用 DTE 以编程方式将项目引用转换为直接 DLL 引用。
假设我有一个简单的解决方案,其中一个Project2
(父项目)引用了一个Project1
(子项目),我进行如下更改:
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;
在 Add 之后添加,但除了设置标志之外它没有任何区别。创建后似乎没有修改路径的选项。
更新:我还尝试以编程方式从 Project2 中删除对 Project1 的任何 Build 依赖项,但这没有任何效果。
以下是 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 属性的句柄)?
更多信息(2011 年 7 月 20 日):
下面Muse VSExtensions的建议不会影响相关 DLL,因为已经从 DLL 的项目 BIN 复制到父项目的 BIN 文件夹。父项目不需要使用引用路径,因为它的输出文件夹中已经有子 DLL。
项目的 .csproj.user 文件也Reference Paths
保存到项目.csproj.user 文件中,而不是项目.csproj 文件中。