【问题标题】:MSBuild: How Do I Calculate a File Checksum Using MSBuild?MSBuild:如何使用 MSBuild 计算文件校验和?
【发布时间】:2019-06-06 20:29:31
【问题描述】:

如何使用 MSBuild 计算文件校验和?

我不想依赖 MSBuild 扩展。

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    一种选择是在项目文件中使用 C# 代码。 该示例展示了如何在 C# 代码之间传递参数。

    <?xml version="1.0" encoding="utf-8"?>
    <Project>
        <UsingTask TaskName="GenerateHash" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
        <ParameterGroup>
          <InputFile ParameterType="System.String" Required="true" />
          <Checksum ParameterType="System.String" Output="true" />
        </ParameterGroup>
        <Task>
          <Using Namespace="System.IO" />
          <Using Namespace="System.Security.Cryptography" />
          <Code Type="Fragment" Language="cs">
            <![CDATA[
                  using (var md5 = MD5.Create())
                  {                
                      using (var stream = new FileStream(InputFile, FileMode.Open))
                      {
                          byte[] bytes = md5.ComputeHash(stream);  
    
                          // Convert byte array to a string   
                          StringBuilder builder = new StringBuilder();  
                          for (int i = 0; i < bytes.Length; i++)  
                          {  
                              builder.Append(bytes[i].ToString("x2"));  
                          }  
                          Checksum = builder.ToString();
                      }
                  }
              ]]>
          </Code>
        </Task>
      </UsingTask>
    
      <Target Name="GenerateManifestJson" AfterTargets="PostBuild" >
        <GenerateHash InputFile="$(FileName)">
          <Output
              TaskParameter="Checksum"
              PropertyName="ArtifactChecksum" />
        </GenerateHash>
    
    
        <ItemGroup>
          <ManifestJson Include="{" />
          <ManifestJson Include="%20&quot;checksum&quot;:&quot;$(ArtifactChecksum)&quot;" />
          <ManifestJson Include="}" />
        </ItemGroup>
    
        <WriteLinesToFile File="c:\temp\hello.manifest.json" Lines="@(ManifestJson)" Overwrite="true" Encoding="utf-8" />
      </Target>
    </Project>
    

    【讨论】:

      【解决方案2】:

      这已在 MSBuild v16 中添加,请参阅 GetFileHash Task

      例子:

      <Project>
        <ItemGroup>
          <FilesToHash Include="$(MSBuildThisFileDirectory)\*" />
        </ItemGroup>
        <Target Name="GetHash">
          <GetFileHash Files="@(FilesToHash)">
            <Output
                TaskParameter="Items"
                ItemName="FilesWithHashes" />
          </GetFileHash>
      
          <Message Importance="High"
                   Text="@(FilesWithHashes->'%(Identity): %(FileHash)')" />
        </Target>
      </Project>
      

      【讨论】:

        猜你喜欢
        • 2017-04-21
        • 2012-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        相关资源
        最近更新 更多