概述:
我们需要使用DTE复制添加引用对话框的行为,当您添加特定的DLL时(它会在CSProj文件中的引用中添加提示路径条目)。
**注意:这里还有一个相关但不是重复的帖子,链接在这里:https://stackoverflow.com/questions/6690655/visual-studio-2010-add-in-how-to-get-a-references-hint-path-property 请阅读该帖子以获取更多关于此问题的信息。我现在已经添加了一个相当高的赏金来获得答案,并将乐意为任何合理的答案提供点赞 :)*
到目前为止:
我正在使用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的引用?
我尝试在添加后添加了dllReference.CopyLocal = false;
,但除了设置标志外,它没有任何区别。创建后似乎没有修改路径的选项。
更新:我还尝试了通过编程方式从Project2中删除对Project1的任何构建依赖关系,但这没有效果。
以下是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。
此外,项目的“引用路径”保存在project.csproj.user文件中,而不是project.csproj文件中。