【问题标题】:Unique Assembly name every build每个构建的唯一程序集名称
【发布时间】:2015-05-06 23:48:18
【问题描述】:

我正在尝试在构建期间更改我的 dll 的程序集名称。我创建了另一个 exe,它更改了我在预构建期间执行的 csproj 文件中的程序集名称。但是好像我对csproj文件的修改要在构建完成后才生效,这当然不是我想要的。

程序集名称在每次构建时都必须是唯一的,因此我通过附加 GUID 来创建它。

var xmlDoc = XDocument.Load(projectFile);
XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
string newAssemblyName = originalAssemblyName + "_" + Guid.NewGuid().ToString("N");

xmlDoc.Element(ns + "Project").Element(ns + "PropertyGroup").Element(ns + "AssemblyName").Value = newAssemblyName;

xmlDoc.Save(projectFile);

我想知道是否有一种方法可以在预构建期间“强制”重新加载 csproj,或者是否有另一种方法可以在每次构建解决方案时获得唯一的程序集名称。

【问题讨论】:

  • 构建后复制可能是廉价而肮脏的解决方案...而且您所做的事情感觉很奇怪,并且可能有更好的解决方案来解决您尝试解决的原始问题(例如卸载插件应用程序域)。
  • 我并不是说你做错了什么,但我也非常很好奇你每次都需要一个唯一的程序集名称的原因。
  • 我确实在另一个应用程序中加载了 dll。我最初的问题是另一个应用程序锁定了 dll,所以我需要关闭它,构建我的 dll,再次加载应用程序。所以我试图自动化我的手动解决方法。我尝试重命名旧的 dll,然后构建一个新的 dll,但我认为我加载它的应用程序以某种方式缓存了它或其他什么,因为我可以让它加载我的新 dll 的唯一方法是更改​​程序集名称。但我当然也愿意寻求更好的解决方案!
  • 为什么使用 DLL 的应用程序在加载它之前不将其复制到本地临时目录?这样,绝对路径会为每个使用它的应用程序创建一个唯一的 dll 名称。

标签: c# pre-build-event


【解决方案1】:

我在 VS2013 中的 csproj 文件中取得了一些成功:

<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
[...]
  <PropertyGroup>
    <MyNewGuid>$([System.Guid]::NewGuid())</MyNewGuid>
  </PropertyGroup>
[...]
  <AssemblyName>$(MyNewGuid)</AssemblyName>

至少,每次我进行重建时,它似乎都会生成一个名称不同的 GUID 的程序集。

如果您使用的是特别旧的 msbuild 版本,您可能想在这里寻找另一种创建 GUID 的方法:http://phoebix.com/2013/08/08/who-got-the-func-part-3-generating-a-guid-in-msbuild/

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多