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:
- creare un vuoto C# biblioteca classs
- Nella cartella della soluzione, fare clic destro il progetto e scegliere "progetto scaricare"
- Fare clic destro il progetto scaricato e scegliete "modifica progetto"
- 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>"$(FrameworkPath)\Ilasm.exe" /NOLOGO /DLL /OUTPUT:"@(IntermediateAssembly)" </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:"$(AssemblyOriginatorKeyFile)" </IlAsmCommand>
</PropertyGroup>
<Exec Command="$(IlAsmCommand) @(Compile->'"%(FullPath)"', ' ')"
Outputs="@(IntermediateAssembly)" />
<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''" />
</Target>
Posso chiedere perché si ha realmente bisogno di compilare con IL? Che cosa ha che C#/VB.NET/F # non può fare? – leppie
@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
@ 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? –