2012-06-11 4 views
12

मैं इस मुद्दे को काफी व्यापक रूप से खोज रहा हूं और मुझे कोई जवाब नहीं मिल रहा है।सी # केवल एक ReadProcessMemory या WriteProcessMemory अनुरोध का हिस्सा प्रक्रिया के दौरान पूरा किया गया था। Kill()

मुझे पता है कि Only part of a ReadProcessMemory or WriteProcessMemory request was completed अपवाद फेंक दिया जाता है जब 32-बिट प्रक्रिया 64-बिट प्रक्रिया तक पहुंचने का प्रयास करती है और 32-बिट प्रक्रिया को संशोधित करने के लिए 64-बिट के लिए समान होती है।

उस समस्या का समाधान प्लेटफ़ॉर्म लक्ष्य को 'किसी भी CPU' में बदलना है। मैंने कोशिश की है और दुर्भाग्य से यह मेरी समस्या का समाधान नहीं करता है।

कोड का अगला ब्लॉक अपवाद फेंकता रहता है। प्रोग्राम जो इस कोड को चलाता है, दूरस्थ कंप्यूटर पर अनुप्रयोग खोलने के लिए उपयोग किया जाता है और प्रोग्राम की खुली सभी प्रक्रियाओं की एक सूची रखता है ताकि मुझे सभी प्रक्रियाओं के माध्यम से लूप न करना पड़े।

Process processToRemove = null; 
lock (_runningProcesses) 
{ 
    foreach (Process p in _runningProcesses) 
    { 
     foreach (ProcessModule module in p.Modules) 
     { 
      string[] strs = text.Split('\\'); 

      if (module.ModuleName.Equals(strs[strs.Length - 1])) 
      { 
       processToRemove = p; 
       break; 
      } 
     } 
     if (processToRemove != null) 
     { 
      break; 
     } 
    } 
    if (processToRemove != null) 
    { 
     processToRemove.Kill(); 
     _runningProcesses.Remove(processToRemove); 
    } 
} 

ये प्रक्रियाएं 32-बिट और 64-बिट, मिश्रित हो सकती हैं।

क्या ऐसा कुछ भी है जो मैं कर रहा हूं कि मुझे नहीं करना चाहिए, या क्या यह सब करने का एक बेहतर तरीका है?

+0

मुझे आपका पूरा कार्यक्रम नहीं पता है, लेकिन चूंकि आपको रिमोट मारने का अधिकार लगता है, क्या आपने PowerShell का उपयोग करने पर विचार किया है और रिमोट इसे मार डाला है? यदि आवश्यक हो तो आप सी # से cmdlets भी कॉल कर सकते हैं। http://4sysops.com/archives/query-and-kill-a-process-on-a-remote-computer-using-powershell-and-wmi/ – Vincent

+0

@ विन्सेंट: यह वही तरीका है जो यह काम करता है। मेरे पास एक "सर्वर" प्रोग्राम है जो मैं कंप्यूटर पर चलाता हूं और उसी कमरे में सभी कंप्यूटर इस सर्वर कंप्यूटर के "क्लाइंट" हैं। सभी क्लाइंट एक क्लाइंट प्रोग्राम चलाते हैं जो टीसीपी संदेशों को स्वीकार करता है। एक प्रोग्राम को बंद करने के लिए, मैं क्लाइंट को एक निश्चित प्रक्रिया को बंद करने के लिए एक टीसीपी संदेश भेजता हूं और ग्राहक अपने स्वयं के कार्यक्रमों की हत्या को संभालता है। –

+0

यह काम कर सकता है। हालांकि मैं निश्चित रूप से कुछ नहीं बता सकता। लेकिन जिस तरह से विंडोज़ प्रक्रियाओं को मारता है वह सी # से Wmi तक अलग हो सकता है। – Vincent

उत्तर

13

the MSDN page for Process.Modules और this thread की टिप्पणी में विस्तृत रूप में Process.Modules में एक ज्ञात मुद्दा है जब एक 64 बिट प्रक्रिया और वीजा प्रतिकूल से 32 बिट प्रक्रियाओं की गणना:

आंतरिक नेट के Process.Modules समारोह उपयोग कर रहा है PSAPI.dll से EnumProcessModules । इस फ़ंक्शन में एक ज्ञात समस्या है कि यह 32/64 बिट प्रक्रिया सीमा में काम नहीं कर सकता है। इसलिए 32-बिट प्रक्रिया से अन्य 64-बिट प्रक्रिया या इसके विपरीत सही ढंग से काम नहीं करता है।

समाधान, EnumProcessModulesEx समारोह, (पी/आह्वान के माध्यम से बुलाया जाना चाहिए जो) का उपयोग करने लगती है लेकिन इस समारोह Windows के बाद के संस्करणों पर ही उपलब्ध है।

हम एक नया कार्य PSAPI.DLL को EnumProcessModulesEx कहा जाता है (http://msdn2.microsoft.com/en-us/library/ms682633.aspx) जोड़कर इस समस्या का समाधान हो, लेकिन हम वर्तमान में नहीं कर सकते इस मामले में इसका इस्तेमाल करते हैं:

  • यह केवल विंडोज विस्टा या विंडोज सर्वर 2008
  • वर्तमान में .NET 2.0 फ्रेमवर्क पर काम करता है एक सर्विस पैक या हॉटफिक्स प्रक्रिया बनाने के लिए नहीं है।मॉड्यूल है कि _runningProcesses अपना समन्वयन वस्तु के रूप में यहाँ नहीं किया जाना चाहिए इस नए एपीआई @ sprinter252 साथ
+0

शायद यह समस्या नहीं है @ केली चल रहा है, क्योंकि यह बग चुपचाप अपवाद फेंकने के बिना कुछ मॉड्यूल की गणना करने में विफल हो जाएगा। –

+0

वास्तव में यह एक अपवाद फेंक देता है। मैं प्रक्रिया के साथ एक ही मुद्दे में चल रहा हूं। मॉड्यूल। – Will

+0

प्रक्रिया के बारे में जानकारी के लिए धन्यवाद। मॉड्यूल। मैंने सोचा था कि यह .NET Framework में सबसे अधिक संभावना थी। जब मैं EnumProcessModulesEx फ़ंक्शन का परीक्षण करता हूं तो मैं प्रतिक्रिया दूंगा। –

3

केवल कुछ प्रक्रियाओं से निपटने के बारे में मुद्दों और ताला है कि मैं बदल जाएगा रहे हैं:

object lockObject = new object(); 
List<Process> processesToRemove = new List<Process>(); 
foreach (Process p in _runningProcesses) 
{ 
    foreach (ProcessModule module in p.Modules) 
    { 
     string[] strs = text.Split('\\'); 

     if (module.ModuleName.Equals(strs[strs.Length - 1])) 
     { 
      processesToRemove.Add(p); 
      break; 
     } 
    }      
}     
lock (lockObject) 
{ 
    foreach (Process p in processesToRemove) 
    {     
     p.Kill(); 
     _runningProcesses.Remove(p); 
    }     
} 

मैं इनाम के लिए जवाब दे नहीं कर रहा हूँ, बस कुछ विचार देना चाहता था। यह कोड परीक्षण नहीं किया गया है क्योंकि मुझे बिल्कुल पता नहीं है कि आप वहां क्या करने की कोशिश कर रहे हैं।

बस प्रक्रिया-सूची को लॉक न करें और जितना संभव हो सके लॉक को न रखें।

0

मैं सहमत हूँ उपयोग करें।

//Somewhere that is accessible to both the thread getting the process list and the thread the 
//code below will be running, declare your sync, lock while adjusting _runningProcesses 
public static readonly object Sync = new object(); 

IList<Process> runningProcesses; 
lock(Sync) 
{ 
    runningProcesses = _runningProcesses.ToList(); 
} 
Process processToRemove = null; 
foreach (Process p in _runningProcesses) 
{ 
    foreach (ProcessModule module in p.Modules) 
    { 
     string[] strs = text.Split('\\'); 
     if (module.ModuleName.Equals(strs[strs.Length - 1])) 
     { 
      processToRemove = p; 
      break; 
     } 
    } 
    if (processToRemove != null) 
    { 
     break; 
    } 
} 
if (processToRemove != null) 
{ 
    //If we've got a process that needs killing, re-lock on Sync so that we may 
    //safely modify the shared collection 
    lock(Sync) 
    { 
     processToRemove.Kill(); 
     _runningProcesses.Remove(processToRemove); 
    } 
} 

इस कोड प्रक्रिया आप को मारने के लिए इच्छा के लिए _runningProcesses जाँच करने के लिए जारी रखने के लिए एक पाश में लपेटा जाता है, तो processesToRemove को processToRemove बदलने पर विचार और बदल यह एक संग्रह करने के लिए टाइप है, के बाद नीचे ब्लॉक में है कि सूची पर पुनरावृति गैर-शून्य गिनती के लिए एक चेक और उस लूप के बाहर लॉक को मारने के लिए प्रति प्रक्रिया ताले को प्राप्त करने और रिलीज़ करने के ऊपरी हिस्से को कम करने के लिए।

संबंधित मुद्दे

 संबंधित मुद्दे