C# 如何以编程方式更新Visual Studio项目中的项目引用
我的文件结构如下所示:C# 如何以编程方式更新Visual Studio项目中的项目引用,c#,visual-studio-2013,msbuild,C#,Visual Studio 2013,Msbuild,我的文件结构如下所示: - binaries - binary1.dll - dev - <developer-name> - a.csproj -trunk - a.csproj -二进制文件 -二进制1.dll -发展 - -a.csproj -树干 -a.csproj 需要在a.csproj上工作的开发人员将在dev中创建一个分支,并从那里开始工作。我们的项目需要在binaries目录中引用binary1.dll 如果引用是相对路径(Vis
- binaries
- binary1.dll
- dev
- <developer-name>
- a.csproj
-trunk
- a.csproj
-二进制文件
-二进制1.dll
-发展
-
-a.csproj
-树干
-a.csproj
需要在a.csproj上工作的开发人员将在dev中创建一个分支,并从那里开始工作。我们的项目需要在binaries目录中引用binary1.dll
如果引用是相对路径(VisualStudio默认值),则该路径将不适用于主干中的项目和开发人员分支中的项目
为了解决这个问题,我考虑创建一个环境变量,并在项目文件中使用它:
<Reference Include="binary1">
<HintPath>$(MY_ENV_VAR)\binary1.dll</HintPath>
</Reference>
$(我的环境变量)\binary1.dll
这很好,但我想帮助开发人员更容易地添加引用,因此我编写了一个程序,将转换指向binary1.dll的相对路径(例如,从开发分支a.csproj,它会将路径。/../binaries/binary1.dll
更改为$(MY_ENV_VAR)\binary1.dll
)但我还没有弄明白如何让它发挥作用
如果使用预构建事件,则项目已加载到内存中,并且该事件返回错误,因为它无法写入项目文件
然后,我意识到我可以重写MSBuild目标,并尝试使用以下目标:beforeciler
,AfterCompiler
,BeforeBuild
,AfterBuild
,并且在所有这些目标中,项目都已被锁定
然后我遇到并修改了代码以调用GenerateApplicationManifest
目标中的可执行文件,但该目标似乎根本没有调用可执行文件
我一直在玩的其他一些想法是创建一个新项目,更新第二个项目,并在它们之间建立链接,但这将重复项目的数量
我也可以改变树干的深度,但这只会隐藏问题,并不能真正解决问题。当开发人员在他们的开发分支中创建一个分支来处理不同的特性或bug时,我又遇到了同样的问题
可能还有另一个功能以更优雅的方式修复了这个问题,但我还没有找到任何东西
所以我的问题是:如何让MS Build或pre Build事件修改CS项目?我找到了一种方法。问题是VisualStudio进程本身正在锁定项目,但VisualStudio可能会覆盖该文件。最后,我修改了a.csproj以包括:
<Target Name="BeforeBuild">
<Exec Command="UpdateReferences.exe" /> <!-- This creates the $(ProjectPath).new file -->
<Move SourceFiles="$(ProjectPath).new" DestinationFiles="$(ProjectPath)" />
</Target>
对于DLL,您只需在项目中设置一个引用路径,并将其更改为不同的文件夹,即可自动使用同一DLL的另一个版本。为什么不在分支时将DLL与您一起复制?@DLeh因为我最终会得到几十个DLL副本,而将库更新为新版本意味着要遍历数据库中的所有文件SCC服务器并确保我更改了所有文件夹。您可以在trunk:trunk\ArtificialFolder-a.csproj下创建一个人工文件夹,这将保留您的相对路径。@granadaCoder在我的问题中,我提到我可以这样解决它,但是如果一个开发人员创建了一个分支,我们就会再次遇到同样的问题。这是一个不错的解决方案,但并不理想。