Ottieni il nome dell’Assembly al momento della compilazione in Visual Studio

Esiste un modo per scoprire il nome dell’assembly in fase di progettazione (ovvero non utilizzare le API di reflection o runtime come System.Reflection.Assembly.GetEntryAssembly) da Visual Studio?

Lo scenario richiede uno strumento per ottenere il nome dell’assembly in cui verrà compilato un progetto di Visual Studio.

Questo è come analizzare la proprietà AssemblyName di .csproj – Mi chiedo se ci siano API in grado di fornire queste informazioni in modo affidabile.

Si prega di non rispondere con le API di runtime che usano il reflection – non ci sono file di assembly presenti al momento in cui ho bisogno del nome dell’assembly – solo i metadati dell’assembly nel file csproj.

L’API che potresti usare è LINQ su XML dopo che tutto il file .csproj è solo xml. (e puoi ottenere la posizione del file .csproj se ti serve dal file della soluzione che per qualche motivo non è XML ma può essere facilmente analizzato)

se si chiama lo strumento tramite un evento post / pre-build, questi dati sono di facile accesso.

Basta andare alla scheda “Proprietà progetto-> Crea eventi”, quindi selezionare “modifica pre-build” o “modifica post-build”, a seconda di quando si desidera eseguire lo strumento. Questo dovrebbe far apparire una finestra di modifica con il sempre utile pulsante “Macro >>”. Premi questo e ti verrà dato un mucchio di macro da usare e dovrebbe essere praticamente tutto ciò di cui hai bisogno.

Puoi utilizzare “TargetName” disponibile in Macro per eventi Post-build. Ti darà il nome dell’assembly per il tuo progetto.

Dopo una rapida corsa attraverso MSDN ho trovato questo articolo che potrebbe essere un buon inizio per ulteriori ricerche:

Accesso al progetto Tipo progetto specifico, Elemento progetto e Proprietà di configurazione

Penso che dovrai scrivere alcune espressioni regolari che ti daranno il valore dell’attributo “AssemblyTitle” nel file AssemblyInfo.cs.

Qualcosa come questo:

public class Assembly { public static string GetTitle (string fileFullName) { var contents = File.ReadAllText (fileFullName); //may raise exception if file doesn't exist //regex string is: AssemblyTitle\x20*\(\x20*"(?.*)"\x20*\) //loading from settings because it is annoying to type it in editor var reg = new Regex (Settings.Default.Expression); var match = reg.Match (contents); var titleGroup = match.Groups["Title"]; return (match.Success && titleGroup.Success) ? titleGroup.Value : String.Empty; } }