Уникальное имя сборки для каждой сборки

Я пытаюсь изменить имя сборки моей dll во время сборки. Я создал еще один исполняемый файл, который изменяет имя сборки в файле 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 во время предварительной сборки или есть другой способ получить уникальное имя сборки каждый раз, когда я создаю свое решение.


person VincentC    schedule 06.05.2015    source источник
comment
Копирование после сборки может быть дешевым и грязным решением... Кроме того, то, что вы делаете, кажется странным, и, возможно, есть лучшее решение для вашей исходной проблемы, которую вы пытаетесь обойти (например, выгрузить домен приложения плагина).   -  person Alexei Levenkov    schedule 07.05.2015
comment
Я не говорю, что вы делаете что-то не так, но мне также чрезвычайно любопытно, почему вам нужно каждый раз уникальное имя сборки.   -  person Ron Beyer    schedule 07.05.2015
comment
Я действительно загружаю dll в другое приложение. Моя первоначальная проблема заключалась в том, что другое приложение блокирует dll, поэтому мне нужно закрыть его, создать свою dll, снова загрузить приложение. Поэтому я попытался автоматизировать свой ручной обходной путь. Я пытался переименовать старую dll, а затем создать новую dll, но я думаю, что каким-то образом приложение, в которое я ее загружаю, кэширует ее или что-то в этом роде, потому что единственный способ заставить ее загрузить мою новую dll - это изменить имя сборки. Но я, конечно же, открыт и для лучших решений!   -  person VincentC    schedule 07.05.2015
comment
Почему приложения, использующие DLL, не копируют ее во временный локальный каталог перед загрузкой? Таким образом, абсолютный путь создает уникальное имя DLL для каждого приложения, использующего его.   -  person Steve    schedule 07.05.2015


Ответы (1)


Мне удалось сделать это внутри файла csproj в VS2013:

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

По крайней мере, каждый раз, когда я выполняю Rebuild, создается сборка с другим GUID для имени.

Если вы используете особенно старую версию msbuild, вы можете найти здесь альтернативный способ создания идентификаторов GUID: http://phoebix.com/2013/08/08/who-got-the-func-part-3-generating-a-guid-in-msbuild/

person ravuya    schedule 07.05.2015