2010-01-23 22 views
7

एक मूल कार्य है:एक फ़ंक्शन के लिए उचित PInvoke हस्ताक्षर क्या है जो var args लेता है?

int sqlite3_config(int, ...); 

मैं इस फ़ंक्शन में PInvoke करना चाहता हूं। वर्तमान में, मेरे पास यह घोषणा है:

[DllImport("sqlite3", EntryPoint = "sqlite3_config")] 
public static extern Result Config (ConfigOption option); 

(परिणाम और कॉन्फ़िगरेशन फॉर्म enum Result : int { ... } के enums हैं।) Xzx25

मैं वास्तव में केवल इस फ़ंक्शन के एकल पैरामीटर संस्करण में रूचि रखता हूं और दूसरे की आवश्यकता नहीं है आर्ग। क्या ये सही है?

मैं भी उत्सुक हूं कि आप दो तर्क फ़ॉर्म कैसे घोषित करेंगे (शायद यह 2 इंटिप्टर लेगा?)।

+0

मुझे आश्चर्य है कि शीर्षक ** एक भिन्न कार्य के लिए उचित PInvoke हस्ताक्षर क्या है? ** अधिक Google अनुकूल होगा। – ChaosPandion

+1

मैं अपने पूरे करियर प्रोग्रामिंग कर रहा हूं और मुझे अभी भी शब्द याद नहीं है ** variadic ** :-) –

+1

उन कंप्यूटर वैज्ञानिकों और उनके अजीब नाम! जाहिर है, धैर्य का अर्थ ** उन तर्कों की संख्या है जो एक कार्य ** ले सकते हैं। – ChaosPandion

उत्तर

8

आप __arglist कीवर्ड (जिसमें undocumented है) का उपयोग करने की जरूरत है, बार्ट # था एक nice blog about it.

उदाहरण

class Program 
{ 
    [DllImport("user32.dll")] 
    static extern int wsprintf([Out] StringBuilder lpOut, string lpFmt, __arglist); 

    static void Main(String[] args) 
    { 
     var sb = new StringBuilder(); 
     wsprintf(sb, "%s %s %s", __arglist("1", "2", "3")); 
     Console.Write(sb.ToString()); 
    }  
} 

vararg तरीकों pinvoking का कोई मानक तरीका है, सबसे समाधान लपेटो जाएगा यह कई विधियों में उदाहरण के लिए

[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)] 
static extern var MyVarArgMethods1(String fmt, 
    String arg1); 

[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)] 
static extern var MyVarArgMethods2(String fmt, 
    String arg1, String arg2); 
+0

मैंने इससे पहले पढ़ा था। यह दस्तावेज क्यों नहीं है? – ChaosPandion

+0

शायद ईसीएमए सबमिशन के लिए समयसीमा याद आती है और अब एमएस उस कीवर्ड को सीपीसी के अपने हिस्से तक प्रतिबद्ध नहीं करेगा। –

+0

यह समझ में आता है। मैं भी मदद नहीं कर सकता लेकिन आश्चर्यचकित हूं कि वे 'arglist' की बजाय' __arglist' का उपयोग क्यों करते हैं। – ChaosPandion

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