假设我的csproj文件或道具文件中声明了SomeValue属性。
有没有办法可以在我的C#代码中引用该属性?
答案 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
引用您的属性。