2013-04-12 8 views
24

से डेटा कॉपी करें मेरे पास length बाइट्स के कुछ डेटा क्षेत्रों को इंगित करने वाले दो IntPtr मान हैं। length में 200k से 400k की परिमाण का क्रम हो सकता है।IntPtr से IntPtr

  int length = /* ..*/ 
      IntPtr ptrSrc = /*.. */; 
      IntPtr ptrDst = /* .. */; 

अब मैं ptrSrc से ptrDst लिए डेटा कॉपी करना चाहते। यह कोड ठीक काम करता है:

  byte[] data = new byte[length]; 
      Marshal.Copy(ptrSrc, data, 0, length); 
      Marshal.Copy(data, 0, ptrDst, length); 

लेकिन इसमें अतिरिक्त अस्थायी (संभावित रूप से विशाल) सरणी की आवश्यकता है। दुर्भाग्य से, मुझे सीधे IntPtr से IntPtr से कॉपी करने के लिए .NET ढांचे में Marshal.Copy संस्करण नहीं मिला, इसलिए मैं विकल्पों की तलाश में हूं।

मुझे ऐसे समाधान में रूचि है जो 32 विंडोज़ और 64 बिट विंडोज पर काम करता है। कोई सुझाव?

+1

क्या आप 'असुरक्षित' का उपयोग कर सकते हैं? – driis

+0

@driis: हाँ, यह संभव है। –

उत्तर

32

आप एप्राइपिएट सी फ़ंक्शन में P/Invoke कर सकते हैं। यह शायद ऐसा करने का सबसे आसान तरीका है। उदाहरण:

class Program 
{ 
    [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)] 
    public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count); 

    static void Main() 
    { 
     const int size = 200; 
     IntPtr memorySource = Marshal.AllocHGlobal(size); 
     IntPtr memoryTarget = Marshal.AllocHGlobal(size); 

     CopyMemory(memoryTarget,memorySource,size); 
    } 
} 
+0

एचएम, क्या यह 32 और साथ ही 64 बिट विंडोज पर काम करेगा? –

+0

हां। 'memcpy' प्रतियों बाइट्स, इसलिए कोई सूचक आकार या शब्द सीमा समस्या नहीं है। सी # marhsalling अंतर्निहित सी समारोह में सही सूचक आकार प्रदान करने का ख्याल रखेगा। – driis

+0

और क्या मैं उपयोगकर्ता मशीन पर स्थापित करने के लिए msvcrt मान सकता हूं, या क्या मुझे अपना खुद का आपूर्ति करना है? मेरा मतलब है, 32 और 64 बिट विंडोज के लिए अलग msvcrt.dll हैं, है ना? मैं सूचक आकार के बारे में चिंतित नहीं हूँ। अधिकांश सिस्टम पर –

3

मुझे लगता है कि इस सवाल का जवाब .net 4.6 में एक अद्यतन है

Buffer.MemoryCopy Method (Void*, Void*, Int64, Int64) 

इस विधि प्रतियां sourceBytesToCopy पता पते के गंतव्य द्वारा निर्दिष्ट स्रोत द्वारा निर्दिष्ट से बाइट्स की जरूरत है। यदि बफर ओवरलैप होते हैं और गंतव्य शून्य स्रोत के बीच का अंतर स्रोतबाइट्सकोपी से कम होता है, तो स्रोत ब्लॉक को गंतव्य क्रम में रिवर्स ऑर्डर में कॉपी किया जाता है।

तो यदि आप 4.6 या सार्वभौमिक विंडोज़ ऐप 10 पर नहीं हैं तो पिछले जवाब का उपयोग करें।

+0

इस अद्यतन के लिए धन्यवाद। निश्चित रूप से यह समाधान यूडब्ल्यूपी ऐप्स के लिए भी काम करता है? मुझे लगता है कि स्वीकृत उत्तर नहीं होगा। –

+0

इसे काम करने के लिए 'असुरक्षित' कोड ब्लॉक की आवश्यकता है। – SMUsamaShah

+0

हां सामान्य है जब आपका सी # और सीधे मेमोरी एक्सेस करें। सी # सी ++ नहीं है जहां ऐसे कार्य अधिक आम हैं – user3800527

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