私の頭の上から、.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
ます。正規表現。CodeDOM
Microsoft.Build.Evaluation