Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式更新Visual Studio项目中的项目引用_C#_Visual Studio 2013_Msbuild - Fatal编程技术网

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在我的问题中,我提到我可以这样解决它,但是如果一个开发人员创建了一个分支,我们就会再次遇到同样的问题。这是一个不错的解决方案,但并不理想。