2012-07-09 5 views
2

Je me demande s'il y a moyen simple de faire en sorte que: lorsqu'un projet C# est compilé, le Csc.exe lancé hérite des paramètres d'affinité du processeur parent; ou peut-être un moyen que je peux fournir cela.affinité du processeur Réglage sur csc.exe lancé par CoreCompile MSBuild Task

J'ai essayé d'y arriver en lançant un fichier bat de VS.NET cmd invite:

start /affinity 01 custombuild.cmd 

intérieur de mon custombuild.cmd je:

@echo off 
msbuild Libraries.sln /t:rebuild /p:Configuration=Release;platform=x64 /m:1 
:END 

L'appel de ligne de commande pour Csc.exe que est généré se présente comme suit:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe ... (. le reste omis par souci de concision)

Je voudrais Csc.exe hériter l'affinité du processeur, ou un moyen simple d'être en mesure de passer outre la façon dont Csc.exe appel est généré de sorte qu'il devient:

start /affinity 01 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe ... (le reste omis par souci de concision.)

J'ai également remarqué que la cible CoreCompile est définie dans Microsoft.CSharp.targets, est-ce que je devrais envisager de surcharger la variable MSBuildToolsPath pour que je puisse me faufiler dans ma propre version. Cela semble plutôt hacky. Toute aide serait très appréciée.

Statut Mise à jour: J'ai travaillé que le processus csc.exe lancé par tâche csc est en fait préparé dans la méthode ExecuteTool de membre de la classe des tâches et j'ai créé une tâche personnalisée CpuAffineCscTask qui dérive de la Csc et overrides Méthode ExecuteTool Mon but est de lancer csc.exe en utilisant un appel pinVoke à CreateProcess en état suspendu, puis de définir l'affinité, puis de reprendre le thread. J'ai également utilisé la réflexion pour rendre l'état de diverses variables correctement défini. Maintenant, j'essaie de remplacer la cible CoreCompile par celle qui est définie dans le fichier MicrosoftCSharp.targets mais lorsque la cible s'exécute, j'obtiens l'erreur d'exécution suivante. Y a-t-il des exemples connus de ceci autour? Même si le cmd entier imprime correctement dans la sortie de diagnostic msbuild. La sortie de diagnostic suit pour votre considération.

Tâche "MSBuild.Tasks.CpuAffineCscTask" (TaskId: 14) C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Csc.exe/noconfig/dangereux +/nowarn: 1701,1702/nostdlib +/errorreport: prompt/warn: 4 /doc:..\Bin\Release\Ugp.Igt.Core.XML/define: TRACE/référence: "C: \ Program Files (x86) \ Assemblées de référence \ Microsoft \ Framework.NETFramework \ v4.0 \ mscorlib.dll "/ reference:" C: \ Program Files (x86) \ Assemblys de référence \ Microsoft \ Framework.NETFramework \ v4.0 \ System.Core.dll "/ reference:" C: \ Program Files (x86) \ référence Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ WindowsBase.dll »/ debug: pdbonly/filealign: 512 /keyfile:..\StrongNameKeyFile.snk/+ optimize /out:obj\Release\Ugp.Igt .Core.dll/target: bibliothèque .. \ DevelopmentKitVersionInfo.cs AnonymousDisposable.cs ByteArrayExtensionMethods.cs TypeMustImplementMe thodAttribute.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): erreur MSB6001: commutateur de ligne de commande non valide pour "Csc.exe". La valeur ne peut pas être nulle. E: \ source \ Core \ Microsoft.CSharp.targets (217,3): erreur MSB6001: Nom du paramètre: SafeHandle ne peut pas être null. Exécution de la tâche "Igt.MSBuild.Tasks.CpuAffineCscTask" - FAILED. (TaskId: 14) Terminé construction de la cible "CoreCompile" dans le projet "Igt.Core.csproj "- ÉCHEC: (TargetId: 37) Cible" _CheckForCompileOutputs: (TargetId: 38) "dans le fichier" c: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Common.targets "du projet" E: \ Source \ Core \ Igt.Core \ Igt.Core.csproj »(cible "_CleanGetCurrentAndPriorFileWrites" dépend):

Toute aide serait très apprécié

PS. Je redirigez les trois flux d'E/S depuis que j'utilise CreateProcess et les tubes, mais après la création, j'utilise la méthode Process.getProcessById .net pour obtenir une référence à l'objet de processus et attacher les gestionnaires


Hardy

Répondre

1

Obtenez la chaîne de commande en remplaçant la méthode executeTool, preappend avec start/affinité 01 l'écrire à un fichier de commandes dans le même dossier que le fichier csproj, utilisez la méthode de shellexecute pour l'exécuter. (pourrait devoir s'assurer que tous les répertoires de sortie existent).

Questions connexes