7

Recentemente ho iniziato a giocare con LuaInterface per far funzionare gli script Lua nei miei programmi C#. Per creare facilmente gli script Lua da Visual Studio, ho installato un plug-in di evidenziazione della sintassi Lua e creato un modello di elementi in modo da poter creare nuovi script facendo clic con il pulsante destro sul file di progetto e selezionando "Nuovo elemento-> Script Lua". Funziona abbastanza bene.È possibile impostare automaticamente "Copia nella directory di output" durante la creazione di file in Visual Studio 2010?

Affinché il programma trovi gli script, è necessario che siano collocati nella stessa directory (o in una sottodirectory) del percorso di creazione. Questo è esattamente dove li voglio, ma per fare questo, devo cambiare l'impostazione "Copia in Output Directory" per ogni nuovo file che creo.

C'è un modo per modificare l'impostazione predefinita di questa opzione? In questo momento, il valore predefinito è "Non copiare". Ho potuto trovare solo one other question chiedendo essenzialmente la stessa cosa, ma l'unica risposta fornita suggeriva un evento post-build che copiava tutti i file con la stessa estensione in una posizione definita. Non desidero davvero farlo poiché la destinazione target potrebbe cambiare o potrebbero essere aggiunti più target (e richiederebbero ulteriori eventi?) E vorrei poter modificare tale impostazione in base al file.

Questo è solo un problema di convenienza, in quanto posso modificare l'opzione manualmente per ogni file, ma essendo stato in grado di automatizzare il resto del processo, speravo di poter automatizzare anche questo un ultimo dettaglio.

risposta

4

Si dovrebbe essere in grado di aggiungere un riferimento IWizard al modello, questo verrà eseguito quando si fa clic su ok in File -> Aggiungi finestra. Avrai bisogno di add the assembly and type per il file vstemplate.

Implementare il metodo RunFinished o eventualmente il metodo ProjectItemFinishedGenerating. È quindi possibile utilizzare l'oggetto EnvDTE esposto da Visual Studio per manipolare qualsiasi elemento della soluzione utilizzando il modello standard di estensibilità di Visual Studio.

The following code snippit (dalla casella degli strumenti T4 open source) mostra come impostare questa proprietà.

/// <summary> 
    /// Sets the known properties for the <see cref="ProjectItem"/> to be added to solution. 
    /// </summary> 
    /// <param name="projectItem"> 
    /// A <see cref="ProjectItem"/> that represents the generated item in the solution. 
    /// </param>   
    /// <param name="output"> 
    /// An <see cref="OutputFile"/> that holds metadata about the <see cref="ProjectItem"/> to be added to the solution. 
    /// </param> 
    private static void SetProjectItemProperties(ProjectItem projectItem, OutputFile output) 
    { 
     // Set "Build Action" property 
     if (!string.IsNullOrEmpty(output.BuildAction)) 
     { 
      ICollection<string> buildActions = GetAvailableBuildActions(projectItem);    
      if (!buildActions.Contains(output.BuildAction)) 
      { 
       throw new TransformationException(
        string.Format(CultureInfo.CurrentCulture, "Build Action {0} is not supported for {1}", output.BuildAction, projectItem.Name)); 
      } 

      SetPropertyValue(projectItem, "ItemType", output.BuildAction); 
     } 

     // Set "Copy to Output Directory" property 
     if (output.CopyToOutputDirectory != default(CopyToOutputDirectory)) 
     { 
      SetPropertyValue(projectItem, "CopyToOutputDirectory", (int)output.CopyToOutputDirectory); 
     } 

     // Set "Custom Tool" property 
     if (!string.IsNullOrEmpty(output.CustomTool)) 
     { 
      SetPropertyValue(projectItem, "CustomTool", output.CustomTool); 
     } 

     // Set "Custom Tool Namespace" property 
     if (!string.IsNullOrEmpty(output.CustomToolNamespace)) 
     { 
      SetPropertyValue(projectItem, "CustomToolNamespace", output.CustomToolNamespace); 
     }  
    } 
+0

Grazie! Sembra che potrebbe funzionare, ma ti capita di avere un link per un esempio o un tutorial? Sto cercando di seguire il tutorial su http://msdn.microsoft.com/en-us/library/ms185301.aspx ma lo trovo un po 'difficile da elaborare. Sto anche avendo difficoltà a trovare un'opzione che controlli l'impostazione 'Copia nella directory di output'. Hai menzionato l'oggetto EnvDTE, quindi penso che sia contenuto nella collezione EnvDTE.ProjectItem.Properties. Questa è la prima volta che ho visto scrivere un'estensione per l'editor, e sembra che la documentazione di questa roba sia un po 'scarsa. –

+0

Esempio di codice aggiunto dal progetto open source T4Toolbox – jessehouwing

+0

Funzionante splendidamente. Questo esempio di codice ha aiutato moltissimo. Grazie! –