是否有任何从Visual Studio项目中编译CIL代码的示例
我意识到有人问及并回答说Visual Studio不支持CIL/MSIL项目。 MSBuildContrib项目有一个ILASM任务,它允许你在编译时编译IL文件。是否有任何从Visual Studio项目中编译CIL代码的示例
谷歌搜索在如何使用这个任务的例子上空了。
是否有任何使用ILASM作为Visual Studio解决方案的一部分的例子? 我意识到#develope和ILIDE支持CIL ...这里的目标是编译一些CIL文件,作为Visual Studio解决方案的一部分。
您可以添加一个“makefile项目”。该模板在Visual C++,General下。此项目类型允许您为构建,清理和重建操作指定自定义构建命令。环境将自动设置,所以你不必乱搞路径。 C++ IDE还支持创建自定义构建规则,以便您可以从文件扩展名(.il)中自动触发正确的工具(ilasm.exe)。
然而,它的质量和它一样好。项目中没有将多个.il文件自动映射到单个构建命令。编写nmake.exe makefile是必需的。并且请注意,自定义构建规则支持在vs2010中被破坏了。
谢谢汉斯!这或多或少是我需要的。顺便说一句 - 任何想法为什么Codeplex上的MSBUILD模板已停产?我在VS2010中尝试了它们,并没有得到任何喜悦......似乎是一个有用的贡献。 – Mark 2010-11-01 18:59:52
是否有任何危险cibproj canibalizing,删除“csharp.targets”,然后添加自定义生成任务来comile IL?在源代码控制方面,这会工作得更好还是更差? – Mark 2010-11-01 19:01:54
没有我发布在这个答案是以任何方式与MSBuild。您可以按照您在构建前/构建事件中指定的方式来执行构建命令。 – 2010-11-01 19:12:12
我给汉斯信用为回答这个问题,但经过一番试验我有这涉及稍微离家较近的一个解决方案:
如何编译CIL/MSIL Visual Studio内部的
的下面的黑客得到你一个项目:
- 尊重Visual Studio中的调试与发布构建配置。
- 可选择使用在项目首选项中设置的密钥文件签署生成的CIL程序集。
- 可以添加到源代码管理。
遵循以下步骤:
- 创建一个空的C#班组长库
- 在解决方案文件夹,右键单击该项目,然后选择“卸载项目”
- 右键单击卸载项目,然后选择“编辑项目”
- 在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>"$(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>
谢谢,这给了我一个有用的起点。我使用的是MonoDevelop,它通常可以编译CIL项目,但是不管这个缺陷是与它一起还是与我无法签署正常工作,并根据上述排序它的ilproj文件的变化。对于单声道构建,用'ildasm'替换'" $(FrameworkPath)\ Ilasm.exe "'(区分大小写),并放弃调试和发布的补充(这两个命令功能单声道ildasm还不支持。 MS也可以加入'/ RESOURCE:someResourceFile.res'(我只是硬编码到第一个'IlAsmCommand'中) – 2013-12-31 20:23:03
请问为什么你真的需要用IL编译? C#/ VB.NET/F#不能做什么? – leppie 2010-11-01 11:30:18
@Leppie - 这是一个适合长时间辩论的话题,足以说有很多(很少有)用IL实现比用C#或VB更容易实现的东西 - 特别是在创建与代表一起工作的泛型时。 IL,可以让你动态地调用pcik,并在调用方法之前选择将哪些参数推入堆栈。 C#和VB没有。通常是一件好事,但有时候会违反规则打开新的大门。动态委托就是一个例子。 – Mark 2010-11-01 18:56:52
@Mark,您可以简要地告诉(或提供一个链接)您可以使用MSIL为代表改进什么?这可以帮助您编写适用于所有委托类型的方法吗? – 2012-10-17 01:17:57