在C#代码中使用props / csproj文件中的属性

时间:2017-01-28 00:30:40

标签: c# msbuild

假设我的csproj文件或道具文件中声明了SomeValue属性。

有没有办法可以在我的C#代码中引用该属性?

2 个答案:

答案 0 :(得分:2)

您可以添加预构建任务以将值注入代码,但无法引用属性,因为项目文件不是代码的一部分 - 它只是代码保存的容器一些用于模板化代码文件的属性,例如项目的默认命名空间,它会自动添加到代码文件中。

答案 1 :(得分:0)

如果您有旧样式的 .net 框架项目,则创建第一个新的 .net 核心项目(其中包含 Sdk="Microsoft.NET.Sdk" 标签),将 TargetFramework 替换为您使用的项目,例如:< /p>

  <PropertyGroup>
    <TargetFramework>net472</TargetFramework>
  <PropertyGroup>

在它编译并正常工作后 ​​- 然后你需要添加 nuget RoslynCodeTaskFactory 包 - 你可以从 UI 或通过直接将项目编辑为 xml 文件来做到这一点(右键单击项目将有 {{1} } 选项).

Edit project

然后添加.cs代码的生成,例如这样:

  <ItemGroup>

... other PackageReferences ...

    <PackageReference Include="RoslynCodeTaskFactory" Version="2.0.7" PrivateAssets="All" />

... other PackageReferences ...

  </ItemGroup>

请注意,<Project InitialTargets="ValidateContentFiles" Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0"> ... <!-- Run-time generated file, based on build_info.props properties --> <ItemGroup> <Compile Include="Autogenerated.cs" Condition="!Exists('$(ProjectDir)Autogenerated.cs')" /> </ItemGroup> <Import Project="$(ProjectDir)\build_info.props" /> <UsingTask TaskName="GenerateFile" TaskFactory="CodeTaskFactory" AssemblyFile="$(RoslynCodeTaskFactory)" Condition=" '$(RoslynCodeTaskFactory)' != ''"> <ParameterGroup> <Filename ParameterType="System.String" Required="true" /> </ParameterGroup> <Task> <Reference Include="System.Core" /> <Using Namespace="System" /> <Using Namespace="System.IO" /> <Code Type="Fragment" Language="C#"> <![CDATA[ String context = ""; var value = "$(YourProperty)"; if(String.IsNullOrEmpty(value) ) { value = "Default fallback if value was not specified"; } //Log.LogMessage(MessageImportance.High, $"file: {Filename} value: {value}"); if( File.Exists(Filename) ) { context = File.ReadAllText(Filename); } var sb = new StringBuilder(); sb.AppendLine("// Autogenerated by .csproj file. Do not edit, your modifications will be lost after generating file again"); sb.AppendLine(); sb.AppendLine("namespace yournamespace {"); sb.AppendLine(" public static partial class YourClassName {"); sb.AppendLine($" public static readonly string YourPropertyKey = \"{value}\";"); sb.AppendLine(" }"); sb.AppendLine("}"); if(sb.ToString() != context) { //Log.LogMessage(MessageImportance.High, $"Saving file '{Filename}'"); File.WriteAllText(Filename, sb.ToString()); } ]]> </Code> </Task> </UsingTask> <Target Name="ValidateContentFiles"> <GenerateFile Filename="$(ProjectDir)Autogenerated.cs" Condition=" '$(RoslynCodeTaskFactory)' != ''" /> </Target> 将在项目构建之前执行,因此您可能看不到 InitialTargets,即使它确实在执行。

如果您在代码本身中有一些错误 - 很可能您不会看到任何错误,因此请尝试添加一行。

之后,您可以使用 Log.LogMessage 引用您的属性。