Если вы хотите применить настраиваемую перезапись, важно переопределить целевые файлы в папке obj.
Это очень важно, поскольку msbuild копирует эти файлы отсюда.
См. Мой ответ ЗДЕСЬ
В моем примере я использую PostSharp в дополнение к моей задаче переписывания.
Но в вашем случае это не проблема:
<PropertyGroup>
<CompileDependsOn>
$(CompileDependsOn);
ApplyILRewriting
</CompileDependsOn>
<BuildDependsOn>
$(BuildDependsOn);
AfterILRewritingPostBuild
</BuildDependsOn>
</PropertyGroup>
<Target Name="ApplyILRewriting">
<ILTransformationTask IntermediateAssemblyPath="$(ProjectDir)$(BaseIntermediateOutputPath)$(Configuration)\$(TargetFileName)" />
</Target>
<!-- Override this target in another file. Build your nuget packages here for example. -->
<Target Name="AfterILRewritingPostBuild">
</Target>
Самое интересное в моем решении то, что код, преобразующий сборку, загружается из целевой сборки. Таким образом, вы можете просто реализовать интерфейс для атрибута и поместить атрибут в свой целевой тип. Он запустит метод в интерфейсе для каждого атрибута, примененного к цели.
Это позволяет вам иметь свои инструкции по переписыванию в целевой сборке, что означает, что для каждого проекта вы можете легко добавлять свои собственные преобразования.
Как видите, я передаю путь к сборке в папке obj. Мое решение работает следующим образом (я не хочу сейчас выпускать полный исходный код, извините):
- создать папку предварительного преобразования в папке obj
- скопировать все файлы из obj / в папку
- создать папку преобразования сообщений
- скопировать все файлы из obj / в папку
- inspect types using reflection:
- load referenced assemblies of your output assembly
- типы атрибутов фильтра, наследующие интерфейс ITransformation
- найти типы, к которым применены эти типы атрибутов
- Загрузите соответствующие сборки и типы с помощью cecil из каталога пост-преобразования.
- выполнить метод Transform (ReflectionDeclaringType, cecilDeclaringTypeDefinition) для атрибутов, которые вы отразили в типах; Это момент, когда ваш собственный код cecil применяет переписывание с помощью интерфейса ITransformation.
Я также создал другой интерфейс, чтобы применить преобразование не к одному типу, а ко всей сборке.
Итак, у меня были ITypeTransformation и IAssemblyTranformation. Одна область видимости для сборки, а также только проходящее отражение и сборка cecil. ITypeTransformation передает отражение, сборку cecil и отражение, тип cecil
Примером преобразования может быть:
public class TestTypeTransformation : Attribute, ITypeTransformationAttribute
{
public void ApplyTransformation(
Assembly preTransformationReflectionAssembly,
AssemblyDefinition postTransformationCecilAssembly,
Type reflectionType,
TypeDefinition cecilType)
{
// Your custom rewriting here
}
}
person
Chris
schedule
25.06.2016