2013-07-13 14 views
8

मुझे लगता है कि एक निर्यातित सी ++ डीएलएल से मेरे सी # प्रोग्राम में एक सरणी को वापस कैसे करना है, यह समझने में प्रतीत नहीं होता है। गुगलिंग से मिली एकमात्र चीज मार्शल.कॉपी() को सरणी को एक बफर में कॉपी करने के लिए उपयोग कर रही थी, लेकिन यह मुझे उन मूल्यों को नहीं देती है जिन्हें मैं वापस करने की कोशिश कर रहा हूं, मुझे नहीं पता कि यह मुझे क्या दे रहा है।वापसी सी ++ सरणी सी #

यहाँ मैं क्या कोशिश कर रहा है या नहीं:

निर्यात समारोह:

extern "C" __declspec(dllexport) int* Test() 
{ 
    int arr[] = {1,2,3,4,5}; 
    return arr; 
} 

सी # भाग:

[DllImport("Dump.dll")] 
    public extern static int[] test(); 

    static void Main(string[] args) 
    { 

     Console.WriteLine(test()[0]); 
     Console.ReadKey(); 


    } 

मैं जानता हूँ कि वापसी प्रकार int [] की वजह से शायद गलत है प्रबंधित/अप्रबंधित मतभेद, मुझे नहीं पता कि यहां से कहाँ जाना है। मुझे कुछ भी जवाब नहीं मिल रहा है लेकिन तारों के लिए चरित्र सरणी लौटा रहा है, पूर्णांक सरणी नहीं।

मुझे लगता है कि मार्शल के साथ मुझे जो मूल्य मिल रहा है, वह कारण नहीं है। कॉपी नहीं है जो मैं लौट रहा हूं क्योंकि निर्यातित फ़ंक्शन में 'arr' सरणी हटा दी जाती है लेकिन मुझे 100% निश्चित नहीं है, अगर कोई इसे साफ़ कर सकते हैं कि यह बहुत अच्छा होगा।

+0

http://stackoverflow.com/questions/3776485/marshal-c-int-array-to-c-sharp यह आपको –

+1

मदद मिल सकती है [अच्छा नहीं।] (Http://stackoverflow.com/प्रश्न/6441218/कैन-ए-लोकल-वेरिएबल्स-मेमोरी-आउट-आउट-आउट-स्कोप) – chris

+0

धन्यवाद क्रिस, मैं इस तरह इतना पकड़ा गया था कि मैं भूल गया कि मैं क्या कर रहा था। मैं अपने कोड को थोड़ा सा बदलने जा रहा हूं, इस तरह से मेरा निर्यात किया गया फ़ंक्शन पते में एक बफर में ले जाता है और वहां से बफर भरता है। – David

उत्तर

10

मैंने श्रीराम ने प्रस्तावित समाधान को लागू किया है। अगर कोई इसे यहां चाहता है तो यह है।

extern "C" __declspec(dllexport) int* test() 
{ 
    int len = 5; 
    int * arr=new int[len+1]; 
    arr[0]=len; 
    arr[1]=1; 
    arr[2]=2; 
    arr[3]=3; 
    arr[4]=4; 
    arr[5]=5; 
     return arr; 
} 

extern "C" __declspec(dllexport) int ReleaseMemory(int* pArray) 
{ 
    delete[] pArray; 
    return 0; 
} 

DLL InteropTestApp बुलाया जाएगा:

C++ में आप इस कोड के साथ एक DLL पैदा करते हैं।

फिर आप सी # में एक कंसोल एप्लिकेशन बनाते हैं।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.InteropServices; 

namespace DLLCall 
{ 
    class Program 
    { 
     [DllImport("C:\\Devs\\C++\\Projects\\Interop\\InteropTestApp\\Debug\\InteropTestApp.dll")] 
     public static extern IntPtr test(); 

     [DllImport("C:\\Devs\\C++\\Projects\\Interop\\InteropTestApp\\Debug\\InteropTestApp.dll", CallingConvention = CallingConvention.Cdecl)] 
     public static extern int ReleaseMemory(IntPtr ptr); 

     static void Main(string[] args) 
     { 
      IntPtr ptr = test(); 
      int arrayLength = Marshal.ReadInt32(ptr); 
      ptr = IntPtr.Add(ptr, 4); 
      int[] result = new int[arrayLength]; 
      Marshal.Copy(ptr, result, 0, arrayLength); 

      ReleaseMemory(ptr); 

      Console.ReadKey(); 
     } 
    } 
} 

result अब मान 1,2,3,4,5 शामिल हैं।

उम्मीद है कि मदद करता है।

+3

यह मदद नहीं करता है। आपको यह दिखाने की आवश्यकता होगी कि आप जादू को कैसे जानते हैं "5" और आप सरणी को कैसे रिलीज़ करने जा रहे हैं, इसलिए कोई स्थायी स्मृति रिसाव नहीं है। –

+3

@ हंस, सवाल "रिटर्न सी ++ सरणी सी #" था। तो, हाँ, यह मदद करता है। – user1764961

+4

ठीक है, तो टिप्पणी को असंख्य googlers को एक चेतावनी चेतावनी पर विचार करें जो आपके उत्तर को कुछ दिन मिलेगा और इस बात का कोई संकेत नहीं है कि कोड एक चलनी की तरह स्मृति को याद करता है और मनमाने ढंग से पहुंच उल्लंघन के साथ बम। –

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