سؤال

لدي سؤال لا أعرف إذا كان يمكن حله.لدي مشروع C# واحد على Visual Studio 2005 وأريد إنشاء أسماء DLL مختلفة اعتمادًا على ثابت المعالج المسبق.ما لدي في هذه اللحظة هو ثابت المعالج المسبق، واثنين من ملفات snk ودليلين للتجميع.أقوم أيضًا بإنشاء تكوينين (Debug و Debug Preprocessor) ويتم تجميعهما بشكل مثالي باستخدام snk وguid المناسبين.

#if PREPROCESSOR_CONSTANT
[assembly: AssemblyTitle("MyLibraryConstant")]
[assembly: AssemblyProduct("MyLibraryConstant")]
#else
[assembly: AssemblyTitle("MyLibrary")]
[assembly: AssemblyProduct("MyLibrary")]
#endif

الآن، لا بد لي من وضع الجمعيتين في GAC.تتم إضافة التجميع الأول دون مشاكل ولكن الثاني ليس كذلك.

ما الذي يمكنني فعله لإنشاء مجموعتين مختلفتين أو أكثر من مشروع Visual Studio واحد؟

من الممكن أنني نسيت تضمين سطر جديد في "AssemblyInfo.cs" لتغيير اسم DLL اعتمادًا على ثابت المعالج المسبق؟

هل كانت مفيدة؟

المحلول

فيما يلي نموذج لحدث ما بعد البناء:

if "$(ConfigurationName)" == "Debug" goto Debug
if "$(ConfigurationName)" == "Release" goto Release

goto End

:Debug
del "$(TargetDir)DebugOutput.dll"
rename "$(TargetPath)" "DebugOutput.dll"

:Release
del "$(TargetDir)ReleaseOutput.dll"
rename "$(TargetPath)" "ReleaseOutput.dll"

:End

يتغير DebugOutput.dll و ReleaseOutput.dll إلى أسماء الملفات الصحيحة.يمكنك التغيير "Debug" و "Release" لدعم التكوينات الأخرى، وإضافة أقسام لدعم المزيد من التكوينات.


سيقوم هذا البرنامج النصي بإنشاء ملفي dll بأسماء ملفات مختلفة؛لإنشاء اسمي تجميع مختلفين، لديك خياران.

تم إنشاء اسم التجميع كـ يتبع:

Name <,Culture = CultureInfo> <,Version = Major.Minor.Build.Revision> <, StrongName> <,PublicKeyToken> '\0'

لذلك يتعين عليك إما تغيير معلومات الثقافة أو الإصدار أو الاسم القوي.

أبسط خيارين هما:

  1. تغيير نسخة التجميع:

    #if SOME_COMPILER_SYMBOL
    [assembly: AssemblyVersion("1.0.0.0")]
    #else
    [assembly: AssemblyVersion("1.0.0.1")]
    #endif
    
  2. قم بتغيير ملف المفتاح - أنشئ ملفين مفتاحيين باستخدام ملف sn أداة، وفي AssemblyInfo.cs:

    #if SOME_COMPILER_SYMBOL
    [assembly: AssemblyKeyFile("FirstKey.snk")]
    #else
    [assembly: AssemblyKeyFile("SecondKey.snk")]
    #endif
    

سيؤدي كلا الخيارين إلى تجميعين مختلفين على حد علم GAC - نظرًا لأنه يقارن اسم التجميع الكامل، وليس الاسم "البسيط".

نصائح أخرى

والبصرية ستوديو لا يسمح لكل التكوين أسماء الانتاج. ومع ذلك، يمكن إعادة تسمية ملف الإخراج كجزء من السيناريو الإنشاء. هل يمكن أن تفعل هذا في بلدكم النصي MSBuild لمشروع معين في السؤال.

وعلى سبيل المثال، وضعت هذا في نهاية الخاص بك .csproj الملف:

<Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)\YourAssembly.dll" DestinationFiles="$(OutputPath)\YourAssemblyRenamed.dll"/>
    <Delete Files="$(OutputPath)\YourAssembly.dll"/>
</Target>

وأنا havn't حاول هذا نفسي حتى تأخذ على أنها اقتراح ودية. محاولة تحرير يدويا .csproj الخاص إضافة أو uncommenting الهدف BeforeBuild مع مقصوص مستوحاة من ما يلي:

<Target Name="BeforeBuild">
    <AssemblyName Condition="'$(Configuration)' == 'Release'">MyReleaseName</AssemblyName>
    <AssemblyName Condition="'$(Configuration)' == 'Debug'">MyDebugName</AssemblyName>
</Target>

وI يعتقد أنه لا توجد طريقة. يتم إصلاح اسم الناتج التجمع بدقة إلى إعدادات المشروع: جمعية واحدة لكل المشاريع

وأيضا AssemblyAttributes هل أعطيت يشير فقط خصائص التجمع مرئية (على سبيل المثال في مستكشف ويندوز)، وليس عليه اسم الملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top