2009-07-27 16 views
8

मैं निम्नलिखित संरचना बनाने के लिए कोशिश कर रहा हूँ ओवरलैप हो:गलत तरीके से गठबंधन या एक गैर वस्तु क्षेत्र त्रुटि

[StructLayout(LayoutKind.Explicit, Size=14)] 
    public struct Message 
    { 
     [FieldOffset(0)] 
     public ushort X; 
     [FieldOffset(2)] 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)] 
     private ushort[] Y; 
     [FieldOffset(12)] 
     public ushort Z; 
    } 

और मैं निम्नलिखित त्रुटि मिलती है:

लोड नहीं कर सका प्रकार 'संदेश' से असेंबली क्योंकि इसमें ऑफसेट 4 पर एक ऑब्जेक्ट फ़ील्ड होता है जिसे ग़लत रूप से गठबंधन किया जाता है या गैर-ऑब्जेक्ट फ़ील्ड द्वारा ओवरलैप किया जाता है।

क्या किसी को पता है कि यह त्रुटि क्यों उत्पन्न कर रहा है?

नोट: मैं पैक का उपयोग नहीं कर सकता क्योंकि मैं कॉम्पैक्ट फ्रेमवर्क के साथ काम कर रहा हूं। धन्यवाद।

उत्तर

8

सीएफ मार्शलर इस प्रकार की चीज़ पर इतना अच्छा नहीं है और आप जो प्रयास कर रहे हैं वह असमर्थित है। समस्या यह है कि यह जानता है कि पहला तत्व अनियंत्रित है, लेकिन ऐसा नहीं लगता है कि सरणी में प्रत्येक तत्व को भी असाइन किया जाएगा।

आप देख सकते हैं व्यवहार इस उदाहरण में काम करता है:

[StructLayout(LayoutKind.Explicit, Size = 14)] 
public struct Message 
{ 
    [FieldOffset(0)] 
    public ushort X; 

    [FieldOffset(2)] 
    private ushort Y1; 

    [MarshalAs(UnmanagedType.LPArray)] 
    [FieldOffset(4)] 
    private ushort[] Y2; 

    [FieldOffset(12)] 
    public ushort Z; 
} 

संरचना के इस प्रकार के लिए, मैं marshaler वैसे भी सदस्यों में से प्रत्येक को संभालने की कोशिश करते हैं कभी नहीं।

[StructLayout(LayoutKind.Explicit, Size = 14)] 
public struct Message 
{ 
    [FieldOffset(0)] 
    public ushort X; 

    [FieldOffset(2)] 
    private ushort Y1; 

    [FieldOffset(4)] 
    private ushort Y2; 

    [FieldOffset(6)] 
    private ushort Y3; 

    [FieldOffset(8)] 
    private ushort Y4; 

    [FieldOffset(10)] 
    private ushort Y5; 

    [FieldOffset(12)] 
    public ushort Z; 
} 

या एक नकली इस तरह "यूनियन" का उपयोग करें:: संरचना छोटा है, तो बाहर प्रत्येक व्यक्ति के मद इस तरह तोड़

public struct Y 
{ 
    public ushort a; 
    public ushort b; 
    public ushort c; 
    public ushort d; 
    public ushort e; 
} 

[StructLayout(LayoutKind.Explicit, Size = 14)] 
public struct Message 
{ 
    [FieldOffset(0)] 
    public ushort X; 

    [FieldOffset(2)] 
    private Y Y; 

    [FieldOffset(12)] 
    public ushort Z; 
} 
+0

ठीक है, इसलिए सबसे आसान जवाब नीचे दी गई टिप्पणी में है: एआरए को सीएफ – SwDevMan81

+0

@ctacke में गठबंधन किया जाना चाहिए: क्या आप मुझे संदर्भ में संदर्भित कर सकते हैं जिसमें सीएफ मार्शलर के बारे में विस्तृत जानकारी है (उदाहरण के लिए किरणों को डीडब्ल्यूओआर को अनावृत किया जाना चाहिए)? – Odrade

+0

@ डेविड: मुझे एक के बारे में पता नहीं है। मैं सभी को मार्शलर और इसकी क्षमताओं (या इसकी कमी) के बारे में पता है, सीएफ टीम के साथ बैठक और बातचीत से है, जो अनुभव के वर्षों के साथ-साथ मैं जो चाहता हूं उसे करने की कोशिश कर रहा हूं। – ctacke

1

समस्या तब हो रही है क्योंकि आपकी सरणी "एक्स" ओवरलैप कर रही है। उल, सी # में, UInt64 है (सी ++ में, उलोंग UInt32 है), इसलिए यह वास्तव में 8 बाइट्स है।

यदि आप अपना दूसरा फील्ड ऑफसेट 8 में बदलते हैं, या एक्स को बदलते हैं, तो यह दूर हो जाएगा।

+0

@Reed - धन्यवाद, मैं अब यह एक ushort को बदल दिया है और मुझे अभी भी त्रुटि मिलती है, क्या 4 बाइट्स है? मैंने msdn और sizeof (ushort) पर देखा है 2 है, लेकिन मुझे त्रुटि मिलती है। जब मैं फ़ील्ड ऑफसेट को 4 में बदलता हूं, तो यह काम करता है। – SwDevMan81

+0

मेरा अनुमान अब इसकी संरेखण समस्या है, क्या मुझे 4 बाइट सीमा पर सरणी शुरू करने की आवश्यकता है? मुझे ऑनलाइन कुछ भी नहीं मिला – SwDevMan81

+1

एआरए सीएफ में गठबंधन डीडब्ल्यूओआर होना चाहिए। अधिक जानकारी और संभावित कामकाज के लिए मेरा जवाब देखें। – ctacke