2010-11-01 7 views
5

Mi rendo conto che è stato chiesto e risposto che Visual Studio non supporta i progetti CIL/MSIL. Il progetto MSBuildContrib ha un'attività ILASM che consente di compilare i file IL in fase di compilazione.Esistono esempi di compilazione di codice CIL da un progetto di Visual Studio

Googled è apparso vuoto su esempi su come utilizzare questa attività.

Esistono esempi di utilizzo di ILASM come parte di una soluzione di Visual Studio? Mi rendo conto che #develope e ILIDE supportano CIL ... l'obiettivo qui è quello di compilare alcuni file CIL come parte di una soluzione di Visual Studio.

+0

Posso chiedere perché si ha realmente bisogno di compilare con IL? Che cosa ha che C#/VB.NET/F # non può fare? – leppie

+2

@Leppie - Questo è un argomento adatto a un lungo dibattito, basti dire che ci sono (ammette poche) cose che sono molto più facili da ottenere con IL che con C# o VB - in particolare quando si creano generici che funzionano con i delegati. IL, con cattiveria, ti consente di eseguire dinamicamente lo pcik e scegliere gli argomenti da inserire nello stack prima di richiamare un metodo. C# e VB no.Normalmente una buona cosa, ma a volte piegando le regole si aprono nuove porte. I delegati dinamici ne sono un esempio. – Mark

+0

@ Mark, puoi dire brevemente (o fornire un collegamento a) cosa puoi migliorare per i delegati che usano MSIL? Questo può aiutarti a scrivere metodi che funzionano per tutti i tipi di delegati? –

risposta

1

È possibile aggiungere un "progetto makefile". Il modello è in Visual C++, Generale. Questo tipo di progetto consente di specificare comandi di compilazione personalizzati per le azioni Crea, Pulisci e Ricostruisci. L'ambiente verrà configurato automaticamente in modo da non dover incasinare i percorsi. L'IDE C++ supporta anche la creazione di una regola di compilazione personalizzata in modo da poter attivare automaticamente lo strumento giusto (ilasm.exe) dall'estensione del nome file (.il).

Questo è comunque il massimo. Non esiste alcuna mappatura automatica di più file .il nel progetto su un singolo comando di compilazione. Per ottenere questo è necessario scrivere un makefile nmake.exe. E attenzione che il supporto per le regole di compilazione personalizzate si è rotto in vs2010.

+0

Grazie Hans! Questo è più o meno quello di cui ho bisogno. BTW - Qualche idea sul motivo per cui i template MSBUILD su Codeplex sono stati interrotti? Li ho provati in VS2010 e non ho avuto la gioia ... mi è sembrato un contributo utile. – Mark

+0

c'è qualche pericolo nella canibalizzazione di un csproj, nella rimozione di "csharp.targets" e quindi nell'aggiunta di attività di compilazione personalizzate per l'IL? Funzionerebbe meglio o peggio in termini di controllo del codice sorgente? – Mark

+0

Nulla di ciò che ho postato in questa risposta è in alcun modo correlato a MSBuild. Fornisci i comandi di compilazione proprio come li avresti specificati in un evento di pre/post build. –

12

ho dato Hans credito per rispondere a questa domanda, ma dopo qualche sperimentazione Ho una soluzione che arriva un po 'più vicino a casa:

come compilare CIL/MSIL ALL'INTERNO VISUAL STUDIO

Il seguendo hack si ottiene un progetto che:

  • Rispetta la configurazione di build Debug vs Release in Visual Studio.
  • Opzionalmente firma l'assembly CIL risultante con il file di chiavi impostato nelle preferenze del progetto.
  • Può essere aggiunto al controllo del codice sorgente.

procedere come segue:

  1. creare un vuoto C# biblioteca classs
  2. Nella cartella della soluzione, fare clic destro il progetto e scegliere "progetto scaricare"
  3. Fare clic destro il progetto scaricato e scegliete "modifica progetto"
  4. Nel file csprof, scorrere verso il basso e trovare la riga che dice "Importa ... Progetto =" $ (MSBuildBinPath) \ Microsoft.CSharp.targets "e sostituirlo con il codice a http://pastebin.com/KEJtyQLu (copiato sotto)

Ecco il XML:

<Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" /> 

    <Target Name="CreateManifestResourceNames" /> 

    <Target Name="CoreCompile" Inputs="$(MSBuildAllProjects);@(Compile);" Outputs="@(IntermediateAssembly);$(NonExistentFile);"> 
    <GetFrameworkPath> 
     <Output TaskParameter="Path" PropertyName="FrameworkPath" /> 
    </GetFrameworkPath> 

    <PropertyGroup> 
     <IlAsmCommand>&quot;$(FrameworkPath)\Ilasm.exe&quot; /NOLOGO /DLL /OUTPUT:&quot;@(IntermediateAssembly)&quot; </IlAsmCommand> 
    </PropertyGroup> 

    <PropertyGroup Condition=" '$(Configuration)' == 'Debug' " > 
     <IlAsmCommand>$(IlAsmCommand) /DEBUG </IlAsmCommand> 
    </PropertyGroup> 

    <PropertyGroup Condition=" '$(Configuration)' == 'Release' " ><IlAsmCommand>$(IlAsmCommand) /OPTIMIZE </IlAsmCommand></PropertyGroup> 

    <PropertyGroup Condition=" '$(AssemblyOriginatorKeyFile)' != '' " > 
     <IlAsmCommand>$(IlAsmCommand) /KEY:&quot;$(AssemblyOriginatorKeyFile)&quot; </IlAsmCommand> 
    </PropertyGroup> 

    <Exec Command="$(IlAsmCommand) @(Compile->'&quot;%(FullPath)&quot;', ' ')" 
      Outputs="@(IntermediateAssembly)" /> 

    <CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''" /> 

    </Target> 
+0

Grazie, mi ha dato un utile punto di partenza. Stavo usando MonoDevelop che normalmente è in grado di compilare i progetti CIL, ma se il difetto era con esso o con me non riuscivo a firmare per funzionare correttamente e basare le modifiche al file ilproj sopra ordinato. Per una compilazione mono, sostituire '" $ (FrameworkPath) \ Ilasm.exe "' con 'ildasm' (sensibile al maiuscolo/minuscolo) e rilasciare il debug e rilasciare aggiunte (che non hanno ancora supportato le funzionalità mono ildasm. MS può anche essere buono da aggiungere in/RESOURCE: someResourceFile.res' (Ho solo hard-coded nel primo 'IlAsmCommand') –