2

我想知道是否有简单的方法可以确保:编译 C# 项目时,Csc.exelaunch 继承父处理器关联设置;或者我可以提供这种方式。

我一直在尝试通过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 变量以便我可以潜入我自己的版本。这感觉相当hacky。任何帮助将非常感激。

状态更新: 我发现由 csc 任务启动的 csc.exe 进程实际上是在 Task 类成员的 ExecuteTool 方法中准备的,并且我创建了一个自定义任务 CpuAffineCscTask,它派生自 Csc 并覆盖了 ExecuteTool 方法。我的目标是在挂起状态下使用对 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”的命令行开关无效。值不能为空。E:\source\Core\Microsoft.CSharp.targets(217,3):错误 MSB6001:参数名称:SafeHandle 不能为空。 完成执行任务“Igt.MSBuild.Tasks.CpuAffineCscTask”——失败。(TaskId:14)在项目“Igt.Core.csproj”中完成构建目标“CoreCompile” - FAILED。:(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 方法来获取对进程对象的引用并附加处理程序。


耐寒

4

1 回答 1

1

通过覆盖executeTool方法获取命令字符串,将其添加到start /affinity 01 将其写入与csproj文件相同的文件夹中的批处理文件,使用shellexecute方法运行它。(可能需要确保所有输出目录都存在)。

于 2012-07-14T21:14:51.003 回答