Question

J'ai une question que je ne sais pas si elle peut être résolue. J'ai un projet C # sur Visual Studio 2005 et je veux créer différents noms de DLL en fonction d'une constante de préprocesseur. Ce que j’ai en ce moment, c’est la constante du préprocesseur, deux fichiers snk et deux guides d’assemblage. Je crée également deux configurations (Debug et Debug Preprocessor), qui se compilent parfaitement à l’aide des instructions snk et guid appropriées.

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

Maintenant, je dois mettre les deux assemblées dans le GAC. Le premier assemblage est ajouté sans problèmes mais le second ne l’est pas.

Que puis-je faire pour créer deux ou plusieurs assemblys différents à partir d'un même projet Visual Studio?

Il est possible que j'ai oublié d'inclure une nouvelle ligne dans "AssemblyInfo.cs". changer le nom de la DLL en fonction de la constante du préprocesseur?

Était-ce utile?

La solution

Voici un exemple d'événement post-build:

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

Remplacez DebugOutput.dll et ReleaseOutput.dll par les noms de fichiers appropriés. vous pouvez modifier "Déboguer" et "Libérer" pour prendre en charge d'autres configurations et ajouter des sections pour prendre en charge d'autres configurations.

Ce script créera deux DLL avec des noms de fichiers différents. pour créer deux noms d'assemblage différents, vous avez deux options.

Le nom de l'assembly est construit comme suit: :

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

Vous devez donc modifier les informations de culture, la version ou le nom fort.

Les deux options les plus simples sont:

  1. Modifier la version de l'assemblage:

    #if SOME_COMPILER_SYMBOL
    [assembly: AssemblyVersion("1.0.0.0")]
    #else
    [assembly: AssemblyVersion("1.0.0.1")]
    #endif
    
  2. Modifiez le fichier de clés - créez deux fichiers de clés à l'aide de l'outil sn et dans AssemblyInfo.cs :

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

Ces deux options se traduiront par deux assemblys différents, pour autant que le GAC le sache - car il compare le nom complet de l'assembly et non le nom "simple".

Autres conseils

Visual Studio n'autorise pas les noms de fichiers de sortie par configuration. Toutefois, vous pouvez renommer le fichier de sortie dans le cadre de votre script de génération. Vous pouvez le faire dans votre script MSBuild pour le projet en question.

Par exemple, placez ceci à la fin de votre fichier .csproj :

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

Je n’ai pas essayé moi-même, alors prenez-le comme une suggestion amicale. Essayez d’éditer manuellement votre fichier .csproj en ajoutant ou en supprimant la mise en commentaire de la cible BeforeBuild avec un extrait inspiré des éléments suivants:

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

Je pense qu’il n’existe pas un tel moyen. Le nom de l'assemblage en sortie est strictement défini dans les paramètres du projet: un assemblage pour un projet.

De même, AssemblyAttributes que vous avez indiqué n'indique que les propriétés d'assemblage visibles (par exemple dans l'Explorateur Windows), pas le nom de fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top