2010-11-01 63 views
5

我意识到有人问及并回答说Visual Studio不支持CIL/MSIL项目。 MSBuildContrib项目有一个ILASM任务,它允许你在编译时编译IL文件。是否有任何从Visual Studio项目中编译CIL代码的示例

谷歌搜索在如何使用这个任务的例子上空了。

是否有任何使用ILASM作为Visual Studio解决方案的一部分的例子? 我意识到#develope和ILIDE支持CIL ...这里的目标是编译一些CIL文件,作为Visual Studio解决方案的一部分。

+0

请问为什么你真的需要用IL编译? C#/ VB.NET/F#不能做什么? – leppie 2010-11-01 11:30:18

+2

@Leppie - 这是一个适合长时间辩论的话题,足以说有很多(很少有)用IL实现比用C#或VB更容易实现的东西 - 特别是在创建与代表一起工作的泛型时。 IL,可以让你动态地调用pcik,并在调用方法之前选择将哪些参数推入堆栈。 C#和VB没有。通常是一件好事,但有时候会违反规则打开新的大门。动态委托就是一个例子。 – Mark 2010-11-01 18:56:52

+0

@Mark,您可以简要地告诉(或提供一个链接)您可以使用MSIL为代表改进什么?这可以帮助您编写适用于所有委托类型的方法吗? – 2012-10-17 01:17:57

回答

1

您可以添加一个“makefile项目”。该模板在Visual C++,General下。此项目类型允许您为构建,清理和重建操作指定自定义构建命令。环境将自动设置,所以你不必乱搞路径。 C++ IDE还支持创建自定义构建规则,以便您可以从文件扩展名(.il)中自动触发正确的工具(ilasm.exe)。

然而,它的质量和它一样好。项目中没有将多个.il文件自动映射到单个构建命令。编写nmake.exe makefile是必需的。并且请注意,自定义构建规则支持在vs2010中被破坏了。

+0

谢谢汉斯!这或多或少是我需要的。顺便说一句 - 任何想法为什么Codeplex上的MSBUILD模板已停产?我在VS2010中尝试了它们,并没有得到任何喜悦......似乎是一个有用的贡献。 – Mark 2010-11-01 18:59:52

+0

是否有任何危险cibproj canibalizing,删除“csharp.targets”,然后添加自定义生成任务来comile IL?在源代码控制方面,这会工作得更好还是更差? – Mark 2010-11-01 19:01:54

+0

没有我发布在这个答案是以任何方式与MSBuild。您可以按照您在构建前/构建事件中指定的方式来执行构建命令。 – 2010-11-01 19:12:12

12

我给汉斯信用为回答这个问题,但经过一番试验我有这涉及稍微离家较近的一个解决方案:

如何编译CIL/MSIL Visual Studio内部的

的下面的黑客得到你一个项目:

  • 尊重Visual Studio中的调试与发布构建配置。
  • 可选择使用在项目首选项中设置的密钥文件签署生成的CIL程序集。
  • 可以添加到源代码管理。

遵循以下步骤:

  1. 创建一个空的C#班组长库
  2. 在解决方案文件夹,右键单击该项目,然后选择“卸载项目”
  3. 右键单击卸载项目,然后选择“编辑项目”
  4. 在csprof文件中,向下滚动到底部,并找到“Import ... Project =”$(MSBuildBinPath)\ Microsoft.CSharp.targets“行,并将其替换为代码在http://pastebin.com/KEJtyQLu(下面复制)

这里的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

谢谢,这给了我一个有用的起点。我使用的是MonoDevelop,它通常可以编译CIL项目,但是不管这个缺陷是与它一起还是与我无法签署正常工作,并根据上述排序它的ilproj文件的变化。对于单声道构建,用'ildasm'替换'" $(FrameworkPath)\ Ilasm.exe "'(区分大小写),并放弃调试和发布的补充(这两个命令功能单声道ildasm还不支持。 MS也可以加入'/ RESOURCE:someResourceFile.res'(我只是硬编码到第一个'IlAsmCommand'中) – 2013-12-31 20:23:03

相关问题