11
votes

Appeler top.exe à partir de System.Diagnostics.Processes échoue

Pour activer Microsoft-Hyper-V et Microsoft-Hyper-V-Gestion dans Windows 2008 R2 Server (64 bits), j'appelle StarXe comme processus. La commande que j'ai utilisée est

Methexe / Online / Get-FeatureInfo / FreeURENAME: Microsoft-hyper-v

Methexe / Online / Get-FeatureInfo / FreeURENAME: Microsoft-Hyper-V-Gestion-Clients

Cela fonctionne bien lorsque j'exécute cela de la ligne de commande, mais cela échoue lorsque j'essaie de l'exécuter à travers mon code. J'ai essayé la version 64 bits de SomptHexe sous le dossier C: \ Windows \ SysWow64, mais elle échoue aussi. Voici le message d'erreur que je reçois,

Vous ne pouvez pas servir de 64 bits en cours d'exécution Système d'exploitation avec une version 32 bits de démontre. Veuillez utiliser la version de Commun qui correspond à votre Architecture de l'ordinateur.

Qu'est-ce que je manque ici?

Mise à jour: SLAKS avait raison, mais le problème s'est avéré être que Mme Visual Studio Express Edition par des cibles par défaut x86 que je devais modifier manuellement dans le fichier .csproj à AnyCPU pour le faire fonctionner.


1 commentaires

SYSWOW64 contient des talons 32 bits, pas des exécutables 64 bits.


4 Réponses :


29
votes

Parce que vous exécutez dans un processus 32 bits, vous êtes se rediriger vers la version 32 bits dans SYSWOW64

Run % Windir% \ sysnatif \ selem.exe pour empêcher la redirection.


3 commentaires

Essayé mais toujours face au même problème, mais pas de chance! Voici deux lignes du journal, MODM.exe: exécution de la ligne de commande: C: \ Windows \ SYSWOW64 \ MODHEXE / Online / Get-FeatureInfo / FeatureName: Microsoft-hyper-v STR FOURNISTER Store: PID = 892 Fournisseur de chargement de l'emplacement C: \ Windows \ System32 \ Dism \ folderProvider.dll - CDISMPROVIDERTRED.DLL - CDISMPROVIDERTRE :: internal_getProvider Bien que j'ai ciblé la version 64 bits de celui-ci, il recherche toujours les processus 32 bits 'Dishibararies


Cela ne semble pas fonctionner pour moi. Sur mon serveur (même système d'exploitation, également 64 bits), il n'y a pas de dossier C: \ Windows \ sysnatifs du tout ...


Le dossier C: \ Windows \ sysnatif n'est visible que vers 32 bits.



5
votes

Créer ci-dessous le contenu dans un fichier de commandes, par exemple Rundism.bat xxx

appelez le fichier de commandes dans votre programme. Sysnative n'est pas un vrai dossier, vous ne pouvez donc pas appeler le code ci-dessus dans votre programme directement, il doit être appelé par système. Cette façon est fonctionnée pour moi.


1 commentaires

Je développe sur Mac maintenant, je ne peux donc pas vérifier cela, mais peut être utile pour quelqu'un d'autre qui est confronté à cette question. Merci



2
votes

La chose est que vous devez appeler le proprementhexe code> dépend sur l'architecture du système.

Comme @ eric Xu dit, vous devez résoudre le chemin car il n'est pas un vrai chemin . Vous trouverez ci-dessous le code qui fonctionne pour moi. Il détecte fondamentalement l'architecture du système, résout le chemin en fonction de l'architecture, puis appelle le DémprimaXe code> P>

string system32Directory = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "system32", "dism.exe");
if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
{
    // For 32-bit processes on 64-bit systems, %windir%\system32 folder
    // can only be accessed by specifying %windir%\sysnative folder.
    system32Directory = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "sysnative", "dism.exe");
}


0 commentaires

0
votes

J'ai dû utiliser "sysnative \ selem.exe" Si j'ai ajouté% Windir% \ Cela échouerait, j'utilise VS2017 Installation sur Server 2012R2. Tnhx!


0 commentaires