2

それを確実にする簡単な方法があるかどうか疑問に思っています.C#プロジェクトがコンパイルされると、Csc.exe起動されたプロジェクトは親プロセッサのアフィニティ設定を継承します。またはおそらく私がこれを提供できる方法です。

batVS.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 メソッドを使用してプロセス オブジェクトへの参照を取得し、ハンドラーをアタッチします。


丈夫な

4

1 に答える 1

1

executeTool メソッドをオーバーライドしてコマンド文字列を取得し、start /affinity 01 を前に追加して、csproj ファイルと同じフォルダー内のバッチ ファイルに書き出し、shellexecute メソッドを使用して実行します。(すべての出力ディレクトリが存在することを確認する必要がある場合があります)。

于 2012-07-14T21:14:51.003 に答える