2013-08-02 9 views
6

से उत्तीर्ण हो गया है, मैं एक सी। डीएल विकसित कर रहा हूं जिसे सी # प्रोग्राम से एक्सेस किया जाना चाहिए। आदर्श रूप से, .dll को सी # में परिभाषित कोई भी संरचना प्राप्त करनी चाहिए और इसके साथ कुछ करना चाहिए। तो, प्रारंभ में, सी प्रकार के लिए संरचना प्रकार और आकार अज्ञात है। मैं सी बाहरी समारोह के माध्यम से संरचना को पारित करने में सक्षम था, और यह ठीक से प्राप्त होने का अनुमान है, लेकिन, क्या इस संरचना के आकार और विशेषताओं को जानने का कोई तरीका है? क्या इसके सदस्यों पर फिर से प्रयास करने का कोई तरीका है?अज्ञात सी संरचना से सी #

यह सी समारोह dll

extern int __cdecl testCSharp(mystruct * Test){ 

//sizeof(Test) is 4, so it is ok 

for(int i=0;i < sizeof(Test) ; i++){ 

    char * value = (char*) Test; //This access the first element. 
    cout << value << endl; //Prints "some random string", so, it is received ok 
} 

return 1; 

}

यह सी # कोड

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)] 
unsafe public struct myStruct{ 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value1; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value2; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value3; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value4; 
}; 

[DllImport("SMKcomUploadDLL.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern int testCSharp(ref myStruct message); 

static void Main() 
{ 
    int result; 

    myStruct message = new myStruct(); 

    message.value1 = "Some randome string"; 
    message.value2 = "0"; 
    message.value3 = "olkujhikvb"; 
    message.value4 = "isabedfbfmlk"; 

    result = testCSharp(ref message); 
} 

सभी प्रकार के सी # में स्ट्रिंग हैं के लिए परिभाषित किया है, और यह करने के लिए suppossed है इस तरह बने रहें, इसलिए यह एकमात्र चीज है जिसे मैं पारित होने वाली संरचना के बारे में जानता हूं।

कोई विचार?

अग्रिम धन्यवाद

+0

* "सी # में परिभाषित किसी भी संरचना को प्राप्त करना चाहिए" * से आपका क्या मतलब है? सी ++ के साथ-साथ सी # स्थिर रूप से टाइप की गई भाषाएं हैं। तो हर प्रकार दोनों तरफ संकलन समय पर जाना जाता है। इसके अलावा, दोनों तरफ के प्रकारों की परिभाषा सुसंगत होनी चाहिए, इसलिए बिना किसी समस्या के मार्शलिंग किया जा सकता है। – Nawaz

+2

मुझे नहीं लगता कि 'sizeof' ऑपरेटर ऐसा करता है जो आपको लगता है। 'आकार (टेस्ट)' रिटर्न 4 क्योंकि पॉइंटर का आकार 4 बाइट्स (32 बिट मशीन पर) है। इसका मतलब यह नहीं है कि टेस्ट में 4 आइटम हैं ... – PoByBolek

+0

@PoByBolek - मुझे यह समझ में नहीं आया कि यह कोड क्या कर रहा है, क्योंकि यह "सरल" स्पष्टीकरण की कल्पना नहीं कर सका। – SChepurin

उत्तर

2

आप 100 की लंबाई के साथ ByValTStr के रूप में उन्हें प्राथमिकता निर्धारण कर रहे हैं के रूप में, मुझे यकीन है कि तुम क्या आपके पास पहले से की तुलना में किसी भी किसी भी अधिक (काम करने के लिए सक्षम हो जाएगा नहीं कर रहा हूँ यानी पहला तत्व)।

MSDN (here)

.नेट फ्रेमवर्क ByValTStr प्रकार से सी-शैली, निश्चित-आकार तार एक संरचना के भीतर की तरह व्यवहार (उदाहरण के लिए, चार रों [5])

यदि आपने एलपीएसआरटी या एलपीडब्लूएसआरटी नल-टर्मिनेशन का इस्तेमाल किया है तो आप उनकी लंबाई को पूरा करने में सक्षम होंगे।

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