2010-11-01 50 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

相關問題