我想知道是否有简单的方法可以确保:在编译C#项目时,Csc.exe
启动会继承父处理器关联设置;或者也许是我可以提供的方式。
我一直试图通过从VS.NET cmd提示符启动bat
文件来实现此目的:
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变量,那么我可以潜入我自己的版本。这感觉相当hacky。任何帮助将不胜感激。
状态更新: 我已经知道csc任务启动的csc.exe进程实际上是在Task类的成员的ExecuteTool方法中准备的,我已经创建了一个自定义任务CpuAffineCscTask,它派生自Csc并覆盖ExecuteTool方法。我的目标是使用对处于挂起状态的CreateProcess的pinvoke调用启动csc.exe,然后设置affinity,然后恢复该线程。我还使用反射来使各种变量的状态正确设置等等。现在我试图覆盖CoreCompile目标,这是在MicrosoftCSharp.targets文件中定义的目标,但是当我的目标运行时,我得到以下运行时错误。 是否有任何已知的示例?即使整个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:library .. \ 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"的命令行开关无效。值不能为空。 E:\ source \ Core \ Microsoft.CSharp.targets(217,3):错误MSB6001:参数名称:SafeHandle不能为空。 完成执行任务" Igt.MSBuild.Tasks.CpuAffineCscTask" - 失败。 (TASKID:14) 完成构建目标" CoreCompile"在项目" Igt.Core.csproj" - 失败:( TargetId:37) 目标" _CheckForCompileOutputs :( TargetId:38)"在文件" c:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Common.targets"来自项目" E:\ source \ Core \ Igt.Core \ Igt.Core.csproj" (目标" _CleanGetCurrentAndPriorFileWrites"取决于它):
非常感谢任何帮助。
PS:我正在重定向所有三个IO流,因为我正在使用CreateProcess和管道但是创建后我使用Process.getProcessById .net方法来获取对进程对象的引用并附加处理程序。
耐寒
答案 0 :(得分:1)
通过覆盖executeTool方法获取命令字符串,使用start / affinity 01预先添加它,将其写入与csproj文件位于同一文件夹中的批处理文件,使用shellexecute方法运行它。 (可能需要确保所有输出目录都存在)。