2010-11-30 11 views
8

मैं विंडोज एपीआई कार्यों के सभी हस्ताक्षर रखना चाहता हूं जो मैं एक वर्ग में प्रोग्रामों में उपयोग कर रहा हूं, जैसे WinAPI, और एक फ़ाइल WinAPI.cs में मैं अपनी परियोजनाओं में शामिल करूंगा। कक्षा आंतरिक स्थिर और विधियों सार्वजनिक स्थैतिक बाहरी होगी। (.NET Framework स्रोत कोड से विशाल NativeMethods.cs की तरह कुछ)।विंडोज एपीआई विधि हस्ताक्षर, संरचनाओं, स्थिरांक के साथ बिग सी # स्रोत फ़ाइल: क्या वे सभी को अंतिम .exe में शामिल किया जाएगा?

मान लीजिए कि WinAPI.cs की तरह एक सौ देशी तरीकों हस्ताक्षर है दो:

[DllImport("user32.dll")] 
internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 
  1. मैं केवल एक परियोजना (यहां तक ​​कि एक या दो) में उनमें से कुछ का उपयोग करने के लिए जा रहा हूँ, तो मैं अपनी परियोजना में WinAPI.cs फ़ाइल शामिल करता हूं, अंतिम .exe अनावश्यक विधि घोषणाओं से भरा होगा जो मैं उपयोग नहीं कर रहा हूं (अन्य 99 या तो)?

  2. मूल संरचना घोषणाओं के बारे में क्या, यदि मैं वर्तमान परियोजना में उनका उपयोग नहीं कर रहा हूं, तो क्या उन्हें अभी भी अंतिम .exe में शामिल किया जाएगा?

    [StructLayout(LayoutKind.Sequential)] 
        public struct POINT 
        { 
         public int X; 
         public int Y; 
        } 
    
  3. स्थिरांक घोषणाओं या की तरह केवल पढ़ने के सदस्यों के बारे में

    क्या:

    public const int WH_JOURNALPLAYBACK = 1; 
    public static readonly int WM_GETTEXT = 0x0D; 
    

उत्तर

2

यह सब तरीकों शामिल किया जाएगा।हालांकि, इसे आईएल के रूप में शामिल किया जाएगा और जब प्रोग्राम चलता है तो यह सिर्फ संकलित मशीन कोड है। हम शायद 40K अंतरिक्ष की बात कर रहे हैं।

+0

क्या आप जानते हैं कि वे सभी क्यों शामिल हैं? यह एक आंतरिक वर्ग है, इसलिए इसे बाहर से संदर्भित नहीं किया जाना चाहिए। सी # कंपाइलर अप्रयुक्त घोषणाओं को देखने में सक्षम क्यों नहीं है और बस उन्हें हटा दें? – AnAurelian

+0

@ डेविड क्योंकि आप संकलन समय पर नहीं जानते हैं कि उनका उपयोग किया जाएगा या नहीं। किसी भी असेंबली (.exe फ़ाइलों सहित) को किसी अन्य प्रोजेक्ट द्वारा संदर्भित करने की आवश्यकता हो सकती है, और जब आप प्रोजेक्ट को संकलित करते हैं तो आप इसके बारे में नहीं जानते। –

+0

भले ही यह एक आंतरिक वर्ग है? "आंतरिक प्रकार या सदस्य केवल एक ही असेंबली में फ़ाइलों के भीतर पहुंच योग्य हैं"? – AnAurelian

1

मैं केवल एक परियोजना (यहां तक ​​कि एक या दो में उन्हें के कुछ का उपयोग करने के लिए जा रहा हूँ, तो), अगर मैं में मेरी प्रोजेक्ट में WinAPI.cs फ़ाइल शामिल है, तो अंतिम .exe को अनावश्यक विधि घोषणाओं के साथ भर दिया जाएगा, मैं नहीं हूं टी का उपयोग कर (अन्य 99 या तो)?

हां, आपकी परियोजना में सभी कोड आपकी असेंबली में संकलित किए जाएंगे;

क्या देशी संरचना के बारे में घोषणाओं, मैं में मौजूदा परियोजना उन्हें प्रयोग नहीं कर रहा हूँ, तो वे अभी भी अंतिम .exe में शामिल किया जाएगा?

हां। उन्हें भी शामिल किया जाएगा।

What about constants declarations or readonly members like: 

हां। उन्हें भी शामिल किया जाएगा।

+0

क्या सी # कंपाइलर को यह अनुकूलित करने का तरीका नहीं है? अगर उनका उपयोग नहीं किया जाता है तो उन्हें क्यों शामिल करें? – AnAurelian

+0

डेविड - क्या होगा यदि आपने पुस्तकालय के रूप में इसका उपयोग करने के लिए अपनी असेंबली का संदर्भ दिया और संदर्भ दिया और निरंतर वहां नहीं था? – Krisc

+0

यह एक आंतरिक वर्ग है, क्या यह केवल उसी असेंबली में फ़ाइलों के भीतर पहुंच योग्य नहीं है? – AnAurelian

2

आपके द्वारा बताए गए सभी तत्व अंतिम असेंबली में शामिल किए जाएंगे। अंतिम एक्सई फ़ाइल से छुटकारा पाने का एकमात्र तरीका प्रीकंपिलेशन निर्देशों का उपयोग है। उदाहरण के लिए:

#if EXCLUDE_METHODS 

// अप्रयुक्त यहाँ

#endif 
+0

"#define के साथ बनाए गए प्रतीक का दायरा वह फ़ाइल है जिसमें इसे परिभाषित किया गया था।" इसका मतलब है कि मैं अपने प्रोजेक्ट सी # स्रोत फ़ाइलों में EXCLUDE_METHODS को परिभाषित नहीं कर सकता, मुझे इसे WinAPI.cs फ़ाइल में करना होगा, जो इस फ़ाइल को असंभव बना देता है। – AnAurelian

+2

आप इसे अपने * .csproj फ़ाइल के गुणों को संपादित करके कर सकते हैं। गुण-> बिल्ड-> सशर्त संकलन प्रतीक। EXCLUDE_METHODS को परिभाषित करें और इस प्रतीक में असेंबली स्कोप होगा। – MichaelMocko

4

यहां छोटी चीजें पसीना न करें। ये सिर्फ घोषणाएं हैं, अंतिम असेंबली में उनके लिए कोई आईएल नहीं है। वे मेटाडेटा में बस कुछ जगह लेते हैं। मतभेद बहुत अधिक हैं कि वे असेंबली से भी लोड नहीं होते हैं, खासकर जब आप घोषणाओं को एक साथ रखते हैं। मेटाडाटा केवल एक बार में 4096 बाइट्स का उपयोग होने पर राम में लोड किया जाता है।

बीटीडब्ल्यू, आप स्पष्ट रूप से इन निरंतर घोषणाओं के लिए पढ़ने के लिए का उपयोग नहीं करना चाहते हैं। अब आप उन्हें स्थान लेने के लिए प्राप्त करते हैं, भले ही उनका उपयोग नहीं किया जाता है। उन कुछ मामलों में से एक जहां सार्वजनिक आधार एक अच्छा विचार है। ये प्रकट स्थिरांक हैं, उनका मूल्य कभी नहीं बदलता है। Math.PI की तरह