Visual Studioプロジェクト内からCILコードをコンパイルする例はありますか
-
28-09-2019 - |
質問
Visual StudioがCIL/MSILプロジェクトをサポートしていないことが尋ねられ、答えられたことを理解しています。 msbuildcontrib プロジェクトには、ビルド時にILファイルをコンパイルできるILASMタスクがあります。
グーグルは、このタスクの使用方法についての例で空っぽになりました。
Visual Studioソリューションの一部としてILASMを使用する例はありますか? #DevelopeとIlideはCILをサポートしていることを理解しています...ここでの目的は、いくつかのCILファイルをコンパイルすることです Visual Studioソリューションの一部として.
解決
「MakeFileプロジェクト」を追加できます。テンプレートは視覚的なC ++の下にあります。このプロジェクトタイプを使用すると、ビルド、クリーン、再構築のカスタムビルドコマンドを指定できます。環境は自動的にセットアップされるため、パスを台無しにする必要はありません。 C ++ IDEはまた、カスタムビルドルールの作成をサポートしているため、ファイル名拡張子(.IL)から適切なツール(ILASM.EXE)を自動的にトリガーできます。
しかし、それは得られるほど良いことです。プロジェクト内の複数の.ilファイルの単一のビルドコマンドへの自動マッピングはありません。 nmake.exe makefileを書くには、それを取得する必要があります。また、VS2010でカスタムビルドルールのサポートが破られたことに注意してください。
他のヒント
私はこの質問に答えたことでハンスに功績を示しましたが、いくつかの実験の後、私は家に少し近づく解決策を持っています。
Visual Studio内でCIL/MSILをコンパイルする方法
次のハックでは、プロジェクトが得られます。
- Visual Studioでデバッグとリリースビルド構成を尊重します。
- オプションで、プロジェクトの設定に設定されたキーファイルを使用して、結果のCILアセンブリに署名します。
- ソースコントロールに追加できます。
次の手順を実行します:
- 空のC#クラスライブラリを作成します
- ソリューションフォルダーで、プロジェクトを右クリックして「アンロードプロジェクト」を選択します
- アンロードされたプロジェクトを右クリックして、「プロジェクトの編集」を選択します
- CSPROFファイルで、下にスクロールして、「インポート... 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>