2010-11-01 10 views
5

Me doy cuenta de que se ha preguntado y respondido que Visual Studio no admite proyectos CIL/MSIL. El proyecto MSBuildContrib tiene una tarea ILASM que le permite compilar archivos IL en tiempo de compilación.¿Hay algún ejemplo de compilación de código CIL dentro de un proyecto de Visual Studio?

Google quedó vacío en ejemplos de cómo usar esta tarea.

¿Hay algún ejemplo de uso de ILASM como parte de una solución de Visual Studio? Me doy cuenta de que #develope y ILIDE admiten CIL ... el objetivo aquí es compilar algunos archivos CIL como parte de una solución de Visual Studio.

+0

¿Puedo preguntar por qué usted realmente necesita compilar con IL? ¿Qué tiene que C#/VB.NET/F # no puede hacer? – leppie

+2

@Leppie: ese es un tema apropiado para un largo debate, basta con decir que hay (con pocas excepciones) cosas que son mucho más fáciles de lograr con IL que con C# o VB, especialmente cuando se crean genéricos que funcionan con delegados. IL, maliciosamente, le permite pcik dinámicamente y elegir qué argumentos presionar a la pila antes de invocar un método. C# y VB no.Normalmente es algo bueno, pero a veces doblar las reglas abre nuevas puertas. Los delegados dinámicos son un ejemplo de esto. – Mark

+0

@Mark, ¿puede decirnos brevemente (o proporcionar un enlace) qué puede mejorar para los Delegados que utilizan MSIL? ¿Esto puede ayudarlo a escribir métodos que funcionen para todos los tipos de delegados? –

Respuesta

1

Puede agregar un "proyecto de archivo MAKE". La plantilla está en Visual C++, General. Este tipo de proyecto le permite especificar comandos de compilación personalizados para las acciones Crear, Limpiar y Reconstruir. El entorno se configurará automáticamente para que no tengas que preocuparte por las rutas. El C++ IDE también admite la creación de una regla de compilación personalizada para que pueda activar automáticamente la herramienta correcta (ilasm.exe) desde la extensión del nombre de archivo (.il).

Sin embargo, es casi tan bueno como se pone. No hay una asignación automática de múltiples archivos .il en el proyecto a un único comando de compilación. Es necesario escribir un archivo make nmake.exe para obtenerlo. Y tenga en cuenta que el soporte de las reglas de compilación personalizadas se rompió en vs2010.

+0

¡Gracias, Hans! Eso es más o menos lo que necesito. Por cierto, ¿alguna idea de por qué las plantillas de MSBUILD en Codeplex se suspendieron? Los probé en VS2010 y no me gustó ... me pareció una contribución útil. – Mark

+0

¿hay algún peligro en canibalizar un csproj, eliminar los "csharp.targets" y luego agregar tareas de compilación personalizadas para comilar el IL? ¿Funcionaría esto mejor o peor en términos de control de fuente? – Mark

+0

Nada de lo que publique en esta respuesta está relacionado de alguna manera con MSBuild. Usted le da los comandos de compilación tal como los especificaría en un evento de compilación pre/post. –

12

me dio crédito Hans para responder a esta pregunta, pero después de un poco de experimentación Tengo una solución que viene un poco más cerca de casa:

cómo compilar CIL/MSIL DENTRO DE VISUAL STUDIO

El El siguiente truco le proporciona un proyecto que:

  • Respeta la configuración de compilación Debug vs. Release en Visual Studio.
  • Opcionalmente firma el ensamblaje CIL resultante con el archivo de clave configurado en las preferencias del proyecto.
  • Se puede agregar al control de fuente.

siga estos pasos:

  1. crear una biblioteca classs vacía C#
  2. En la carpeta de soluciones, haga clic derecho en el proyecto y elegir la opción "Descargar proyecto"
  3. Haga clic derecho en el proyecto sin carga y seleccione "editar proyecto"
  4. En el archivo csprof, desplácese hasta la parte inferior y busque la línea que dice "Importar ... Proyecto =" $ (MSBuildBinPath) \ Microsoft.CSharp.targets ", y reemplácelo por el código al http://pastebin.com/KEJtyQLu (copiado a continuación)

Aquí está el 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

Gracias, eso me dio un punto de partida útil. Estaba usando MonoDevelop, que normalmente puede compilar proyectos CIL bien, pero si el error estaba con eso o conmigo no pude hacer que la firma funcione correctamente, y basando los cambios en el archivo ilproj en el anterior ordenados. Para una compilación mono, reemplace '" $ (FrameworkPath) \ Ilasm.exe "' con 'ildasm' (distingue entre mayúsculas y minúsculas) y elimine las adiciones de depuración y liberación (que ambas características de hit mono ildasm aún no admiten. Por el contrario, MS también puede ser bueno agregar '/ RESOURCE: someResourceFile.res' (Acabo de codificarlo en el primer' IlAsmCommand') –

Cuestiones relacionadas