تغيير برمجيا سمات التجميع والتجميع
-
20-09-2019 - |
سؤال
أثناء عملية إنشاء الإعداد ، أخطط للقيام بما يلي (ضمن أ C# السيناريو):
- إقرأ ال
AssemblyVersion
وAssemblyFileVersion
قيم السمة من DLL واحد. - تكرار جميع DLLs و Executables في المشروع وتطبيق تلك النسخة على
AssemblyVersion
وAssemblyFileVersion
قيم السمة.
السؤال الآن هو: كيف تفعل الخطوة 2؟
لقد نجحت في القيام بخطوة 1 ، لكن بالنسبة للخطوة 2 ، لا أرى نقطة بداية حقيقية. ما يجب علي فعله هو استخدام بعض أساليب P/الاستدعاء الأصلية لأن السمات تعدل مباشرة معلومات مورد معلومات الإصدار من DLL/قابلة للتنفيذ.
أي تلميحات على هذا؟
المحلول
لماذا لا تقرأ ، أثناء عملية الإنشاء AssemblyVersion
و AssemblyFileVersion
من DLL ، وحفظه مرة أخرى إلى CSPROJECT الأخرى AssemblyInfo.cs
, ، ثم فقط تجميعها؟
في الواقع ، لا أعرف ما إذا كان من الممكن تعديل ملف DLL مباشرة ، دون اللجوء إلى شيء خيالي.
أو بدلاً من ذلك ، تأكد من أن جميع DLLs تشترك AssemblyInfo.cs
. يمكنك القيام بذلك عن طريق إضافة AssemblyInfo.cs
كـ "إضافة رابط" عند إضافة عنصر جديد في Csproject. وبهذه الطريقة عندما تقوم بتجميع ، ستشارك جميع DLLs نفس الشيء AssemblyInfo.cs
, ، وبالتالي إخراج نفسه AssemblyVersion
.
نصائح أخرى
في حالتي ، قمت بإنشاء قالب T4 لتغيير التحويل التجميلي والتجميع. اتصلت بـ template assembly.tt ، وجعلته ملفًا مرتبطًا (عند إضافته ، اختر إضافة رابط ، بدلاً من إضافة). جميع تجميعاتي تسحب في ملف Assembly.tt المرتبط.
يمكنك بعد ذلك تشغيل قالب T4 من موقع واحد وسيقوم بتحديث جميع عمليات التحمل والتجميع. ليس عليك الاتصال بـ File AssemblyInfo.cs حتى يتم سحب المعلومات إلى DLLs الخاصة بك.
رمز ملف assembly.tt هو:
<#@ template language="C#" hostspecific="true" #>
//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//
using System.Reflection;
[assembly: AssemblyVersion("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")]
[assembly: AssemblyFileVersion("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")]
<#+
int RevisionYear = DateTime.UtcNow.Year;
int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year,1,1)).TotalDays;
int RevisionTime = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day)).TotalMinutes;
#>
سيكون إخراج قالب T4 أعلاه:
//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//
using System.Reflection;
[assembly: AssemblyVersion("4.2016.284.1066")]
[assembly: AssemblyFileVersion("4.2016.284.1066")]
إذا كان لديك إمكانية الوصول إلى المصادر ، خذ نصيحة من Graviton
إذا لم تقم بذلك ، فقد تكون في ورطة. ربما يمكنك تفكيك مع ildasm وإعادة تجميعها مع Ilasm. ولكن هذا لن ينجح في تجمعات قوية.