是否有一种方法可以将环境变量传递给Visual Studio项目并在c#中使用它?

本文关键字:项目 Studio Visual 一种 方法 环境变量 是否 | 更新日期: 2023-09-27 18:16:14

我想让我的Windows Phone应用程序访问构建机的环境变量。

在我的场景中,我特别想传递USERNAME变量,所以当我在调试构建的情况下查看手机应用程序的分析报告时,我可以看到哪个开发人员正在运行应用程序,看看是我还是其他人。我可以想到其他类似的场景,在运行时访问构建时值会很有用,所以我想找到一个通用的解决方案来解决这个问题。

我可以想到一个解决方案-使用预构建事件定义来创建或更新.cs文件,并将常量设置为构建时环境变量值,但这似乎有点难看,我希望看到版本控制系统的问题。我希望也许有一些技巧使用DefineConstants或其他设置它使用一些简单的msbuild项目自定义?

是否有一种方法可以将环境变量传递给Visual Studio项目并在c#中使用它?

您可以按照建议的那样做:在构建时使用常量创建.cs文件。为了避免版本控制系统的潜在问题,不要将此文件添加到版本控制中并将其创建在版本控制忽略的位置(如obj'Debugobj'Release文件夹)。

在MSBuild中,它看起来像这样:

在CSPROJ文件的最后一个"Import"元素后面添加以下内容:

<PropertyGroup>
    <!-- Make sure our file is build on every compile -->
    <CompileDependsOn>
      _CreateMyFile;
      $(CompileDependsOn)
    </CompileDependsOn>
</PropertyGroup>
<Target Name="_CreateMyFile">
   <!-- Add code to create the file on demand. 
   You could write a custom task, or execute some external tool.
   As an example assume it is created as "$(IntermediateOutputPath)'EnvVars.cs".
   Where IntermediateOutputPath expands to "obj'Debug" or "obj'Release", respectively.
   Either typically beign ignored by version control systems.
   -->
   <!-- Add file to files to be compiled. -->
   <ItemGroup>
       <Compile Include="$(IntermediateOutputPath)'EnvVars.cs"/>
   </ItemGroup>
</Target>

您可以考虑将上述内容放入自定义的.proj文件中,然后将其导入到您的CSPROJ文件中。

哦,我一点也不觉得那难看。就我个人而言,我将它用于各种这样的任务,如汇编版本属性等。

更新:为了防止每次构建(或F5等)都调用目标,您可以使用Target元素的InputsOutputs属性。MSDN页面不是太有帮助,但基本上它的工作原理如下:MSBuild将检查Output属性中指定的所有文件是否与Inputs属性中指定的文件是最新的。

因此,您可以像这样更改目标定义(PropertyGroup元素保持不变,只是为了完整性而添加):
<PropertyGroup>
    <!-- Make sure our file is build on every compile -->
    <CompileDependsOn>
      _CreateMyFile;
      $(CompileDependsOn)
    </CompileDependsOn>
</PropertyGroup>
<Target Name="_CreateMyFile"
   Inputs="$(IntermediateOutputPath)'EnvVars.cs"
   Outputs="$(IntermediateOutputPath)'EnvVars.cs">
   <!-- Create EnvVars.cs file -->
   <WriteLinesToFile
        File="$(IntermediateOutputPath)'EnvVars.cs"
        Lines="namespace Foo {}"
        Overwrite="true"
        Encoding="Unicode"/>
   <!-- Add file to files to be compiled. -->
   <ItemGroup>
      <Compile Include="$(IntermediateOutputPath)'EnvVars.cs"/>
   </ItemGroup>
   <!-- Add file to files to be removed on target "clean". -->
   <ItemGroup>
      <FileWrites Include="$(IntermediateOutputPath)'EnvVars.cs"/>
   </ItemGroup>
</Target>

这里的技巧如下:如果envars .cs不存在,它将被创建。如果它确实存在(那么)它将不再被创建,因此不会强制在F5上构建。然而,我们必须提供一些摆脱文件的方法。因此,将它添加到FileWrites ItemGroup中,该ItemGroup包含调用"clean"或"rebuild"目标(或Visual Studio中的相应菜单命令)时要删除的文件。所以如果你想要一个新的envars .cs文件,只需重新构建或清理。

您可以尝试移动应用程序块,它基本上只是一个移动应用程序配置。

http://blogs.msdn.com/b/priozersk/archive/2010/07/06/app-config-for-wp7-applications.aspx

和这似乎是一个整洁的方式设置msbuild选择一个适当的应用程序配置文件http://www.timvw.be/2008/03/17/easily-switching-between-appconfig-files-with-msbuild/

结合这两种方法,你可以让你的构建设置配置和应用程序使用配置文件。