Domanda

Ho una domanda che non so se può essere risolta. Ho un progetto C # su Visual Studio 2005 e voglio creare nomi DLL diversi a seconda di una costante del preprocessore. Quello che ho in questo momento è la costante del preprocessore, due file snk e due guide dell'assembly. Creo anche due configurazioni (Debug e Debug Preprocessor) e si compilano perfettamente usando snk e guid appropriati.

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

Ora, devo inserire i due assembly nel GAC. Il primo assembly viene aggiunto senza problemi ma il secondo no.

Cosa posso fare per creare due o più assembly diversi da un progetto Visual Studio?

È possibile che abbia dimenticato di includere una nuova riga su " AssemblyInfo.cs " modificare il nome DLL in base alla costante del preprocessore?

È stato utile?

Soluzione

Ecco un esempio di evento 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

Cambia DebugOutput.dll e ReleaseOutput.dll con i nomi file corretti. puoi modificare " Debug " e " Release " per supportare altre configurazioni e aggiungere sezioni per supportare più configurazioni.


Quello script creerà due dll con nomi di file diversi; per creare due diversi AssemblyNames, hai due opzioni.

Il nome dell'assembly viene creato come segue :

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

Quindi devi cambiare le informazioni sulla cultura, la versione o il nome sicuro.

Le due opzioni più semplici sono:

  1. Modifica la versione dell'assembly:

    #if SOME_COMPILER_SYMBOL
    [assembly: AssemblyVersion("1.0.0.0")]
    #else
    [assembly: AssemblyVersion("1.0.0.1")]
    #endif
    
  2. Modifica il file di chiavi: crea due file di chiavi con lo strumento sn e in AssemblyInfo.cs :

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

Entrambe queste opzioni daranno luogo a due assiemi diversi per quanto ne sa il GAC, poiché confronta il nome completo dell'assemblaggio e non il nome "semplice".

Altri suggerimenti

Visual Studio non consente nomi di file di output per configurazione. Tuttavia, è possibile rinominare il file di output come parte dello script di compilazione. Puoi farlo nel tuo script MSBuild per il particolare progetto in questione.

Ad esempio, inseriscilo alla fine del tuo file .csproj :

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

Non ho provato questo da solo, quindi prendilo come suggerimento amichevole. Prova a modificare manualmente il tuo .csproj aggiungendo o decommentando il target BeforeBuild con uno snipped ispirato al seguente:

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

Penso che non esista. Il nome dell'assembly di output è rigorosamente fissato nelle impostazioni del progetto: un assembly per un progetto.

Anche AssemblyAttributes che hai dato indica solo le proprietà di assembly visibili (ad esempio in Esplora risorse), non il nome del file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top