それを確実にする簡単な方法があるかどうか疑問に思っています.C#プロジェクトがコンパイルされると、Csc.exe
起動されたプロジェクトは親プロセッサのアフィニティ設定を継承します。またはおそらく私がこれを提供できる方法です。
bat
VS.NET cmd プロンプトからファイルを起動して、これを達成しようとしています。
start /affinity 01 custombuild.cmd
私のcustombuild.cmd
中には:
@echo off
msbuild Libraries.sln /t:rebuild /p:Configuration=Release;platform=x64 /m:1
:END
生成されるコマンド ライン呼び出しCsc.exe
は次のようになります。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe ...
(残りは簡潔にするために省略されています。)
プロセッサのアフィニティを継承するか、呼び出しの生成Csc.exe
方法をオーバーライドして次のようにする簡単な方法を継承したいと思います。Csc.exe
start /affinity 01 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe ...
(残りは簡潔にするために省略されています。)
また、CoreCompile ターゲットが Microsoft.CSharp.targets で定義されていることにも気付きました。MSBuildToolsPath 変数をオーバーライドして、独自のバージョンに忍び込むことを検討する必要があります。これはかなりハッキーに感じます。どんな助けでも大歓迎です。
ステータスの更新: csc タスクによって起動された csc.exe プロセスが、Task クラスのメンバーの ExecuteTool メソッドで実際に準備されていることがわかりました。Csc から派生し、ExecuteTool メソッドをオーバーライドするカスタム タスク CpuAffineCscTask を作成しました。私の目標は、中断された状態で CreateProcess への pinvoke 呼び出しを使用して csc.exe を起動し、アフィニティを設定してからスレッドを再開することです。また、リフレクションを使用して、さまざまな変数の状態を正しく設定するなどしました。現在、MicrosoftCSharp.targets ファイルで定義されている CoreCompile ターゲットをオーバーライドしようとしていますが、ターゲットを実行すると、次のランタイム エラーが発生します。このあたりの既知の例はありますか?cmd全体がmsbuild診断出力に正しく出力されますが。参考までに、診断出力を以下に示します。
タスク "MSBuild.Tasks.CpuAffineCscTask" (TaskId:14) C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /unsafe+ /nowarn:1701,1702 /nostdlib+ /errorreport:prompt /warn: 4 /doc:..\Bin\Release\Ugp.Igt.Core.XML /define:TRACE /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\mscorlib. dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Core.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\ Microsoft\Framework.NETFramework\v4.0\WindowsBase.dll" /debug:pdbonly /filealign:512 /keyfile:..\StrongNameKeyFile.snk /optimize+ /out:obj\Release\Ugp.Igt.Core.dll /target:ライブラリ ..\DevelopmentKitVersionInfo.cs AnonymousDisposable.cs ByteArrayExtensionMethods.cs TypeMustImplementMethodAttribute.cs WeakEvent.cs "C:\Users\bhatiah\AppData\Local\Temp.NETFramework,Version=v4.0.AssemblyAttributes.cs" (TaskId:14) E:\source\Core\Microsoft.CSharp.targets(217,3): エラー MSB6001: "Csc.exe" のコマンド ライン スイッチが無効です。値を null にすることはできません。E:\source\Core\Microsoft.CSharp.targets(217,3): エラー MSB6001: パラメーター名: SafeHandle を null にすることはできません。 タスク "Igt.MSBuild.Tasks.CpuAffineCscTask" の実行が完了しました -- 失敗しました。(TaskId:14) プロジェクト "Igt.Core.csproj" でターゲット "CoreCompile" をビルドしました -- 失敗しました。: (TargetId:37) ターゲット "_CheckForCompileOutputs: (TargetId:38)" ファイル "c:\Windows\Microsoft.プロジェクト "E:\source\Core\Igt.Core\Igt.Core.csproj" からの NET\Framework\v4.0.30319\Microsoft.Common.targets" (ターゲット "_CleanGetCurrentAndPriorFileWrites" はそれに依存します):
どんな助けでも大歓迎です。
PS: CreateProcess とパイプを使用しているため、3 つの IO ストリームすべてをリダイレクトしていますが、作成後に Process.getProcessById .net メソッドを使用してプロセス オブジェクトへの参照を取得し、ハンドラーをアタッチします。
丈夫な