gpt4 book ai didi

c# - list 文件的 dependentAssembly/assemblyIdentity 元素中的版本号

转载 作者:太空宇宙 更新时间:2023-11-03 15:29:55 26 4
gpt4 key购买 nike

我正在使用一个应用程序,其中包括一个非托管客户端 DLL 和一个托管 COM 服务器 DLL(这本身就是一个挑战:Managed Reg-Free COM Server Won't Activate),现在我想知道什么是最好的方法来保持版本号同步。由于我们同时构建客户端和服务器,并且我们尝试在每次构建时保持所有文件的版本号同步,所以看起来我需要一个过程来编辑客户端和服务器上的所有 list 文件在完整构建发生之前结束我所有独立的 COM 引用。有没有更简单的方法?

示例(客户端 list ):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="globals" version="1.0.0.0" />
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="SoftBrands.FourthShift.FSCulture" version="8.0.0.999" publicKeyToken="541b4aff0f04b60a" />
</dependentAssembly>
</dependency>
</assembly>

服务器 list :

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity type="win32" name="SoftBrands.FourthShift.FSCulture" version="8.0.0.999" publicKeyToken="541b4aff0f04b60a" />
<clrClass clsid="{23D4FF3D-EEDF-4F68-AD65-749958EE3B2A}"
name="SoftBrands.FourthShift.FSCulture.FSCulture"
tlbid="{8D480B22-D603-309F-9A26-EA9E9B020207}">
</clrClass>
</asmv1:assembly>

我可以进行全局搜索,并将每个构建的 version="8.0.0.999" 替换为当前版本,但我怀疑可能有更好的方法。

最佳答案

最好的办法是在编译之前利用自定义 MSBuild 任务来操作项目工件。

任务应该接受三个属性。客户端 list 的一个属性,服务器 list 的另一个属性,版本的第三个属性。

这是目标文件在 MSBuild 中的样子。

Manifests.targets

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<!-- Import Tasks -->
<!-- Be sure to sue the full namespace of the task to import -->
<UsingTask TaskName="Full.Namespace.To.UpdateManifestsTask" AssemblyFile="$(MSBuildThisFileDirectory)\MyCustomTasks.dll" />
<!-- Define the location of the client and server manifest files -->
<PropertyGroup>
<ClientManifest><!-- Location of the client manifest --></ClientManifest>
<ServerManifest><!-- Location of the server manifest --></ServerManifest>
</PropertyGroup>
<!-- Define Generate App Config Target -->
<Target Name="UpdateManifests">
<UpdateManifests ClientManifest="$(ClientManifest)" ServerManifest="$(ServerManifest)" Version="$(Version)" />
</Target>
<!-- Define Before Build Target -->
<!-- This will ensure the above target gets executed prior to compilation -->
<Target Name="BeforeBuild">
<CallTarget Targets="UpdateManifests;" />
</Target>
</Project>

这是自定义任务的样子 -

UpdateManifestsTask.cs

public class UpdateManifestsTask : Task
{
public ITaskItem ClientManifest { get; set; }
public ITaskItem ServerManifest { get; set; }
public ITaskItem Version { get; set; }

public override bool Execute()
{
var newVersion = string.Format("name=\"SoftBrands.FourthShift.FSCulture\" version=\"{0}\"", this.Version.ItemSpec);
var clientFile = File.ReadAllText(this.ClientManifest.ItemSpec);
clientFile = Regex.Replace(clientFile, "name=\"SoftBrands.FourthShift.FSCulture\" version=\"\\d*\\.\\d*\\.\\d*\\.\\d*\"", newVersion);
File.WriteAllText(this.ClientManifest.ItemSpec, clientFile);
var serverFile = File.ReadAllText(this.ClientManifest.ItemSpec);
serverFile = Regex.Replace(clientFile, "name=\"SoftBrands.FourthShift.FSCulture\" version=\"\\d*\\.\\d*\\.\\d*\\.\\d*\"", newVersion);
File.WriteAllText(this.ServerManifest.ItemSpec, serverFile);

return true;
}
}

RegEx 有点草率,因为这是一个快速而肮脏的示例,但这实际上是您执行此类操作的方式。

请务必添加对 MSBuild 库的引用。

http://blogs.msdn.com/b/msbuild/archive/2006/01/21/515834.aspx

如果您不想构建自定义任务,您可以编写一个小型控制台应用程序来执行相同的操作,但我认为自定义任务更简洁。

如果您决定采用控制台应用路线,您可以在项目文件中利用 BeforeBuild 和 AfterBuild 事件。

  <Target Name="BeforeBuild">
<!-- Invoke console app -->
</Target>
<Target Name="AfterBuild">
</Target>

关于c# - list 文件的 dependentAssembly/assemblyIdentity 元素中的版本号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34140098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com