是否有一种方法可以将环境变量传递给Visual Studio项目并在c#中使用它?
本文关键字:项目 Studio Visual 一种 方法 环境变量 是否 | 更新日期: 2023-09-27 18:16:14
我想让我的Windows Phone应用程序访问构建机的环境变量。
在我的场景中,我特别想传递USERNAME变量,所以当我在调试构建的情况下查看手机应用程序的分析报告时,我可以看到哪个开发人员正在运行应用程序,看看是我还是其他人。我可以想到其他类似的场景,在运行时访问构建时值会很有用,所以我想找到一个通用的解决方案来解决这个问题。
我可以想到一个解决方案-使用预构建事件定义来创建或更新.cs文件,并将常量设置为构建时环境变量值,但这似乎有点难看,我希望看到版本控制系统的问题。我希望也许有一些技巧使用DefineConstants或其他设置它使用一些简单的msbuild项目自定义?
您可以按照建议的那样做:在构建时使用常量创建.cs
文件。为了避免版本控制系统的潜在问题,不要将此文件添加到版本控制中并将其创建在版本控制忽略的位置(如obj'Debug
或obj'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
元素的Inputs
和Outputs
属性。MSDN页面不是太有帮助,但基本上它的工作原理如下:MSBuild将检查Output
属性中指定的所有文件是否与Inputs
属性中指定的文件是最新的。
<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/
结合这两种方法,你可以让你的构建设置配置和应用程序使用配置文件。