2012-05-09 14 views
7

द्वारा बनाए गए XmlSerializers.dll का उपयोग नहीं कर रहा है मेरे विजुअल स्टूडियो 2010 प्रोजेक्ट में, मैं XmlSerializers.dll बनाने के लिए sgen का उपयोग करने के लिए निम्न पोस्ट-बिल्ड इवेंट कमांड लाइन का उपयोग करता हूं।XmlSerializer sgen

पोस्ट घटना का निर्माण:

"$(ProgramFiles)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\sgen.exe" /a:"$(TargetPath)" /c:/keyfile:"c:\myproject\mykey.snk" /f 

मेरे परियोजना मजबूत नामित है, इसलिए मजबूत नाम "XmlSerializers.dll" करने के लिए एक ही कुंजी का उपयोग करें। वीएस आउटपुट फ़ोल्डर में XmlSerializers.dll बनाता है।

हालांकि, मैंने ProcessMonitor का उपयोग करके देखा है, .NET अभी भी रनटाइम पर CSC.exe का आह्वान करता है। मैं इस post पर आया, जहां उपयोगकर्ता को समान समस्या थी और XmlSerializer (टाइप) कन्स्ट्रक्टर का उपयोग करके हल किया गया था।

मैं अपने कोड में एक ही तकनीक का इस्तेमाल किया लेकिन यह अभी भी Csc.exe आह्वान:

var fs = new FileStream(SettingsFilePath, FileMode.Open); 
try 
{ 
var serializer = new XmlSerializer(typeof(AppSettings)); 
settings = (AppSettings)serializer.Deserialize(fs); 
} 
finally 
{ 
fs.Close(); 
} 

कारण मैं प्रदर्शन के कारण, precompiled एक्सएमएल क्रमबद्धता उपयोग करने की आवश्यकता है और यह भी मैं कभी कभी Csc.exe मिली त्रुटियाँ पर देखा है विंडोज शटडाउन शॉर्टडाउन के दौरान फॉर्म बंद होने पर मेरा एप्लिकेशन डेटा सहेजता है, यह विफल रहता है क्योंकि विंडोज शट डाउन अनुक्रम के दौरान एक नई प्रक्रिया शुरू करने की अनुमति नहीं देगा। मैंने एक्सएमएल सीरियलाइजेशन को प्रीकंपलिंग करके इसके आसपास होने के लिए सिफारिशें देखी हैं।

XmlSerializer sgen द्वारा बनाए गए XmlSerializers.dll का उपयोग क्यों नहीं कर रहा है इसके बारे में कोई सुझाव?

धन्यवाद।

+0

शट डाउन समस्या के लिए सबसे आसान इलाज स्टार्टअप पर डेटा लोड करना है। असेंबली रिज़ॉल्यूशन की जांच के लिए fuslogvw.exe का उपयोग करें। –

+0

धन्यवाद, मेनफॉर्म बंद होने पर मुझे डेटा को सहेजने की आवश्यकता है (एक्सएमएल को क्रमबद्ध करें)। उपयोगकर्ता द्वारा सामान्य बंद होने के दौरान ठीक है, कोई त्रुटि नहीं, डेटा क्रमबद्ध है। हालांकि, अगर मेरा एप्लिकेशन चल रहा है और विंडोज शटडाउन है तो मैं CSC.exe त्रुटियों को देखता हूं। – Din

उत्तर

0

क्या आपने जेनरेट डीएल पर ngen.exe चलाने की कोशिश की है?

रनिंग

ngen.exe install myproject.XmlSerializers.dll 

छवि कैश में dll, जो JIT कम्पाइलर लागू बजाय कार्यावधि में इस्तेमाल किया जाना चाहिए के एक देशी छवि स्थापित हो जाएगा।

+0

धन्यवाद, मैंने ngen.exe का उपयोग करने के आपके सुझाव की कोशिश की है, लेकिन अभी भी ProcessMonitor में cse.exe कॉल देखें। – Din

+0

यहां प्रोसेस मॉनिटर का स्क्रीनशॉट है: http://screencast.com/t/iyKu79yv "DataSerializer.XmlSerializers.dll" sgen द्वारा बनाई गई धारावाहिक डीएल है। – Din

4

समस्या Possiby अलग लक्ष्य मंच है: डिफ़ॉल्ट sgen 'किसी भी सीपीयू' (MSIL) का उपयोग करता है के द्वारा, अगर विधानसभा प्रकार युक्त deserialized किया जाना है या धारावाहिक 86 ओ x64 के लिए संकलित किया गया है, यह .XmlSerializers.dll

लोड नहीं होगा

/// <summary>Generates an identifier for the assembly of a specified type</summary> 
/// <remarks>Code copied from the .NET serialization classes - to emulate the same bahavior</remarks> 
/// <param name="type">The type</param> 
/// <returns>String identifying the type's assembly</returns> 
static string GenerateAssemblyId(Type type) 
{ 
    Module[] modules = type.Assembly.GetModules(); 
    ArrayList list = new ArrayList(); 
    for (int i = 0; i < modules.Length; i++) { 
    list.Add(modules[i].ModuleVersionId.ToString()); 
    } 
    list.Sort(); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < list.Count; i++) { 
    sb.Append(list[i].ToString()); 
    sb.Append(","); 
    } 
    return sb.ToString(); 
} // GenerateAssemblyId 

/// <summary>Verifies that the serialization assembly for the specified type can be loaded</summary> 
/// <remarks>Code copied from the .NET serialization classes - to emulate the same behavior and tests</remarks> 
/// <param name="type">The type</param> 
static void AssertCanLoadXmlSerializers(Type type) 
{ 
    if (type == null) 
    throw new ArgumentNullException("type"); 
    Assembly serializerAssembly = null; 
    // Create the name of the XML serilizers assembly from the type's one 
    AssemblyName name = type.Assembly.GetName(true); 
    name.Name = name.Name + ".XmlSerializers"; 
    name.CodeBase = null; 
    name.CultureInfo = CultureInfo.InvariantCulture; 
    try { 
    serializerAssembly = Assembly.Load(name); 
    } catch (Exception e) { 
    Assert.Fail("Unable to load XML serialization assembly for type '{0}': {1}", type.FullName, e.Message); 
    } 
    object[] attrs = serializerAssembly.GetCustomAttributes(typeof(XmlSerializerVersionAttribute), false); 
    if (attrs == null || attrs.Length == 0) { 
    Assert.Fail(
     "Unable to use XML serialization assembly '{1}' for type '{0}': it does not contain XmlSerializerVersionAttribute", 
     type.FullName, 
     serializerAssembly.FullName 
    ); 
    } 
    if (attrs.Length > 1) { 
    Assert.Fail(
     "Unable to use XML serialization assembly '{1}' for type '{0}': it contains multiple XmlSerializerVersionAttribute", 
     type.FullName, 
     serializerAssembly.FullName 
    ); 
    } 
    XmlSerializerVersionAttribute assemblyInfo = (XmlSerializerVersionAttribute)attrs[0]; 
    string assemblyId = GenerateAssemblyId(type); 
    if (assemblyInfo.ParentAssemblyId != assemblyId) { 
    Assert.Fail(
     "Unable to use XML serialization assembly '{1}' for type '{0}': it does not match assembly id '{2}'", 
     type.FullName, 
     serializerAssembly.FullName, 
     assemblyId 
    ); 
    } 
} // AssertCanLoadXmlSerializers 

बस से गुजर प्रकार AssertCanLoadXmlSerializers() फोन: यहाँ कुछ कोड है कि एक इकाई परीक्षण के रूप में ही व्यवहार को पुनः है -

सामान्य रूप में अधिक है, मैं नेट कोड कि क्रमबद्धता विधानसभाओं लोड पर एक नज़र था धारावाहिक/deserialized होने की जरूरत है। यदि क्रमबद्धता असेंबली लोड नहीं होती है तो आपको त्रुटि संदेशों से क्यों एक अच्छा विचार हो सकता है।

मैंने इसे हमारे यूनिट परीक्षण में जोड़ा, ताकि मैं उचित रूप से सुनिश्चित हो सकूं कि धारावाहिक असेंबली ठीक है।

+0

यह कोड काफी उपयोगी है। धन्यवाद। अगर मैं अंतिम ब्लॉक ("यह असेंबली आईडी से मेल नहीं खाता है) पर विफलता विफल होने पर समस्या को ठीक करने का तरीका समझने की कोशिश कर रहा हूं। क्या आप इसका अर्थ समझ सकते हैं कि इसका क्या अर्थ है और इसे ठीक करने के बारे में संभवतः कैसे जाना है? –

+0

यह थोड़ी देर हो गया है ... असेंबली आईडी उस असेंबली में मॉड्यूल के संस्करण संख्याओं से बना है, यदि वे अलग हैं तो इसका मतलब यह होगा कि दो असेंबली (जिसमें एक प्रकार और क्रमबद्धता वाला एक) शामिल है विभिन्न मॉड्यूल - या एक ही मॉड्यूल के विभिन्न संस्करण - तो शायद क्रमबद्धता असेंबली के बाद कुछ बदलाव हो गए हैं? आईडी को देखते हुए आपको अलग-अलग – MiMo

+0

धन्यवाद का एक संकेत देना चाहिए - यह एक अच्छा प्रारंभिक बिंदु है। –

0

क्या आप सुनिश्चित हैं कि क्रमबद्धता असेंबली सही तरीके से हस्ताक्षरित है? आमतौर पर आपको उद्धरण से बचने की जरूरत होती है। अधिक जानकारी के लिए here देखें।

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

यदि यह सब सही है: उपकरण अक्षम करें -> विकल्प -> डिबगिंग -> "बस मेरा कोड सक्षम करें" और डीबग -> उत्साह -> सामान्य भाषा रनटाइम अपवाद -> फेंक दें। फिर उस बिंदु पर अपने आवेदन को डीबग करें जहां क्रमबद्धता की जाती है। एक पहला मौका अपवाद बताएगा कि धारावाहिक असेंबली का उपयोग क्यों नहीं किया जा सकता है।

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

  • कोई संबंधित समस्या नहीं^_^