c# - 如何在运行时读取给定项目中的 MSBuild 属性?

标签 c# parameters msbuild .net-4.5

我想访问单元测试中的 MSBuild 变量,这是一个 .NET 4.5 类库项目(经典 csproj),但我找不到任何讨论将值从 MSBuild 传递到执行上下文的方法的文章。

我想过在编译期间设置一个环境变量,然后在执行期间读取该环境变量,但这似乎需要一个自定义任务来设置环境变量值,我有点担心变量的范围(理想情况下,我只希望它对当前正在执行的项目可用,而不是全局可用)。

是否有在运行时从 DLL 项目中读取 MSBuild 属性的已知解决方案? MSBuild 属性可以在执行期间以某种方式“作为参数传递”吗?

最佳答案

我最终通过使用 .Net Core 项目中默认使用的相同代码生成任务使其工作。唯一的区别是我必须在 csproj 文件中手动添加 Target 才能使其工作,因为代码创建不是框架项目的标准:

<Target Name="BeforeBuild">
  <ItemGroup>
    <AssemblyAttributes Include="MyProject.SolutionFileAttribute">
      <_Parameter1>$(SolutionPath)</_Parameter1>
    </AssemblyAttributes>
  </ItemGroup>
  <WriteCodeFragment AssemblyAttributes="@(AssemblyAttributes)" Language="C#" OutputDirectory="$(IntermediateOutputPath)" OutputFile="SolutionInfo.cs">
    <Output TaskParameter="OutputFile" ItemName="Compile" />
    <Output TaskParameter="OutputFile" ItemName="FileWrites" />
  </WriteCodeFragment>
</Target>

带有 CompileFileWrites 的行可以很好地与 clean 等配合使用(请参阅我上面评论中的链接答案)。其他一切都应该足够直观。

当项目编译时,一个自定义属性被添加到程序集中,然后我可以使用正常反射检索:

Assembly
    .GetExecutingAssembly()
    .GetCustomAttribute<SolutionFileAttribute>()
    .SolutionFile

这非常有效,让我可以避免对解决方案文件进行任何硬编码搜索。

关于c# - 如何在运行时读取给定项目中的 MSBuild 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56835671/

相关文章:

c# - 如何将数据从 Controller 操作传递到布局模板中的子操作?

msbuild - 是否可以避免本地安装并使用 WiX 的平面文件?

.net - 根据 VS2008 中构建的配置排除整个文件

c# - 如何在 ASP.NET MVC 中对私有(private) Controller 方法进行单元测试?

c# - 用c#编写编排

c# - 锁定不起作用

python - 在 Python 中的用户函数中同时传递多个数据帧作为参数

c++ - 数组的初始化体作为函数参数(C-array),这可能吗?

java - 禁止为方法参数传递某些值

visual-studio-2005 - 如何使用 MSBuild 将文件复制到另一个目录?