私の頭の上から、.cs/type 名のクラス/ディクショナリを構築してハッシュ/タイムスタンプにするトランスフォーム オン ビルドT4を作成するか、そのプロパティをトークン化し、MSBuild のBeforeBuildイベントにフックして、コンパイル前に同様のものに置き換えます。ハッシュ/最終変更。
編集:わかりましたので、ここに非常に大雑把な例をいくつか示します。
T4 -- プロジェクト (.tt) にテキスト テンプレートを作成し、以下を貼り付けます。
<#@ template hostspecific="true" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
namespace ClassLibrary1
{
    public class Version
    {
        <#  var project = new FileInfo(Host.ResolvePath("ClassLibrary1.csproj"));
            WriteLine("// " + project.FullName);
            var files = project.Directory.GetFileSystemInfos("*.cs", SearchOption.AllDirectories);
            foreach (var file in files)
            {
                var name = Path.GetFileNameWithoutExtension(file.Name);
                if (name == "Version")
                    continue; #>
               public const long <#= name #> = <#= file.LastWriteTime.Ticks #>;
        <#  } #>
    }
}
これで、Version.ClassName 定数を介した比較で使用できるクラスができました。
MSBuild -- .csproj を編集し、最後に以下を追加します。
<UsingTask TaskName="Version" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
  <ParameterGroup>
    <Files ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
  </ParameterGroup>
  <Task>
    <Using Namespace="System.IO" />
    <Using Namespace="System.Text.RegularExpressions" />
    <Code Type="Fragment" Language="cs"><![CDATA[
          var regex = new Regex(@"Version = (\d+);//(-?\d+)");
          foreach (var file in Files)
          {
              var source = File.ReadAllText(file.ItemSpec);
              var match = regex.Match(source);
              if (!match.Success) continue;
              var hash = regex.Replace(source, string.Empty).GetHashCode();
              if (int.Parse(match.Groups[2].Value) == hash) continue;
              source = regex.Replace(source, string.Format("Version = {0};//{1}", int.Parse(match.Groups[1].Value) + 1, hash));
              File.WriteAllText(file.ItemSpec, source);
          }
      ]]></Code>
  </Task>
</UsingTask>
<Target Name="BeforeBuild">
  <Version Files="@(Compile)" />
</Target>
public const int Version = 0;//0次に、クラスに追加します。コンパイル前に、MSBuild はファイルのハッシュを取得し、前のハッシュが一致しない場合はカウンターを更新します。
これらの例にはもっとうまくできるクラプトンがありますが、うまくいけば、それらはあなたが取ることができる方向性を示しています. より良い方法があるかもしれません。これらは、Mono.Cecil で IL をハッシュした後に頭に浮かんだ最初の 2 つのアイデアです。この質問は非常に興味深いものでした。いずれかのルートに進む場合は、T4 とそのビルド時の再生成を強制する方法、または MSBuild とイベントの拡張、カスタム タスクとインライン タスクを読むことをお勧めHostしEnvDTEます。正規表現。CodeDOMMicrosoft.Build.Evaluation