2011-08-05 15 views
6

मुझे एक ढांचा मिला है जिसमें कई आधार वर्ग शामिल हैं जिन्हें कई ऐप्स विकसित करने के लिए प्राप्त किया जा सकता है। इन वर्गों में से System.Windows.Forms.Panel का एक उप-वर्ग है जिसके लिए मैंने अपना खुद का डिजाइनर लिखा था। सब कुछ विजुअल स्टूडियो 2005 के साथ ठीक काम कर रहा है, लेकिन जब मैं वीएस -2010 में जाने की कोशिश करता हूं तो कुछ गलत हो जाता है। यह मैं क्या कर रहा हूँ का एक बहुत सरलीकृत संस्करण है:विजुअल स्टूडियो असेंबली के लिए कहां दिखता है?

public interface IConf 
{ 
    string foo { get; set; } 
    void InitFoo(); 
} 

public class SimpleClass 
{ 
    public string foo; 
} 

public class ConfLoader 
{ 
    public static IConf LoadConf() 
    { 
     AssemblyName anAssemblyName = new AssemblyName("ConfClasses"); 
     Assembly anAssembly = Assembly.Load(anAssemblyName); 
     IConf result = (IConf)anAssembly.CreateInstance("ConfClasses.ConfClass"); 
     result.InitFoo(); 
     return result; 
    } 
} 

तो फिर वहाँ एक परियोजना ConfClasses CoreClasses का संदर्भ और सिर्फ एक में शामिल है जो है:

मैं एक परियोजना CoreClasse कहा जाता है जो एक इंटरफेस और दो वर्गों में शामिल है वर्ग को लागू करने IConf:

public class ConfClass : IConf 
{ 
    public SimpleClass confVal; 

    public string foo 
    { 
     get { return confVal.foo; } 
     set { confVal.foo = value; } 
    } 

    public void InitFoo() 
    { 
     confVal = new SimpleClass(); 
     confVal.foo = "bar"; 
    } 
} 

और अंत में जो केवल CoreClasses का संदर्भ और पैनल के एक उपवर्ग और संबद्ध डिजाइनर शामिल हैं नियंत्रण के लिए एक परियोजना है:

[Designer("MyControls.Design.SimplePanelDesigner", typeof(IRootDesigner))] 
public class SimplePanel : Panel 
{ 
    public SimpleClass dummy = new SimpleClass(); 
} 

public class SimplePanelDesigner : DocumentDesigner 
{ 
    public IConf DesignerConf; 

    public SimplePanelDesigner() 
     : base() 
    { 
     DesignerConf = ConfLoader.LoadConf(); 
    } 
} 

अब मैं एक और समाधान तैयार करता हूं जो इन सभी डीएलएस का संदर्भ देता है और इसमें सरल पैनेल का खाली उप-वर्ग शामिल है। जब मैं SolutionExplorer में इस वर्ग पर डबल क्लिक करता हूं तो SimplePanelDesigner के निर्माता को निष्पादित किया जाता है और ConfLoader की विधि LoadConf को कॉल किया जाता है। इसका मतलब है कि ConfClasses.dll को डायनामिक रूप से लोड किया गया है और ConfClass का एक उदाहरण बनाया गया है। सब कुछ ठीक है इस पल तक, लेकिन जब इनिटफू को यह अपवाद कहा जाता है तो उठाया जाता है:

फ़ाइल या असेंबली 'कोर क्लास, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, पब्लिककेट टोकन = नल' या इसके एक लोड नहीं हो सका निर्भरता। सिस्टम निर्दिष्ट फाइल का पता लगाने में नाकामयाब रहा।

चीजों को कठिन बनाने के लिए, अपवाद वास्तव में इस उदाहरण को उठाया नहीं गया है, लेकिन यह वास्तव में मेरे वास्तविक ऐप को निष्पादित करने का अपवाद है, और अपवाद मुझे मिल रहा है। मुझे यहां क्या हो रहा है इसका एक संकेत नहीं मिला है। वीएस कोरक्लास में एक विधि निष्पादित कर रहा है। यह फिर से लोड करने की कोशिश क्यों कर रहा है? और यह कहां खोज रहा है? मैंने वर्तमान ऐपडोमेन को भी चेक किया है, लेकिन इसमें कोरक्लास को इसकी लोडेड असेंबली के बीच है, और ऐसा लगता है कि यह बदल नहीं रहा है।

बस कुछ और विवरण जोड़ने के लिए, प्रत्येक प्रोजेक्ट एक सामान्य फ़ोल्डर में बनता है (प्रोजेक्ट फ़ोल्डर के अंदर सामान्य ओबीजे/डीबग फ़ोल्डर नहीं), और पीसी शुरू होने पर पीसी पर मेरे डीएलएस की कोई अन्य प्रति नहीं है मेरा इम्तिहान। फिर सभी संदर्भित डीएल की एक प्रति मेरे उपयोगकर्ता प्रोफाइल के ऐपडाटा \ स्थानीय \ माइक्रोसॉफ्ट \ विजुअलस्टूडियो \ 10.0 \ ProjectAssemblies फ़ोल्डर में फ़ोल्डर की एक श्रृंखला में की जाती है, और ऐसा लगता है कि वीएस विधानसभा के दौरान असेंबली की तलाश में है। लोड निष्पादित किया गया है, और मुझे वहां कोरक्लास की एक प्रति मिल सकती है। मैंने सभी फ़ोल्डर्स को साफ करने की कोशिश की, सब कुछ पुनर्निर्माण करने के लिए, और प्रत्येक संयोजन में अलग-अलग समाधान खोले/बंद रखने के लिए, लेकिन बिना किसी सुधार के।

संपादित करें:

रूप GranMasterFlush सुझाव दिया, इस FusionLog अपवाद द्वारा उत्पन्न होता है:

=== Pre-bind state information === 
LOG: User = FCDB\fc0107 
LOG: DisplayName = XEngine.Core, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null (Fully-specified) 
LOG: Appbase = file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/ 
LOG: Initial PrivatePath = NULL 
Calling assembly : (Unknown). 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.Config 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: The same bind was seen before, and was failed with hr = 0x80070002. 
ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002). 

संपादित 2

बस कुछ जानकारी जोड़ने के लिए, मैं संलयन लॉग पर एक दृष्टि डाली मेरे सरल उदाहरण से उत्पन्न हुआ और पता चला कि CoreClasses को लोड करने का प्रयास करते समय बिल्कुल वही लॉग उत्पन्न हुआ है, लेकिन किसी भी VisualStudio को इसका सामना करने का एक तरीका मिल गया है।

+0

मैंने [procmon] (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) का उपयोग किया था, यह सत्यापित करने के लिए कि वह वास्तव में 'AppData \ Local \ Microsoft \ VisualStudio \ 11.0 \ ProjectAssemblies \ <कुछ अस्थायी नाम> '। अंत में ऐसा इसलिए था क्योंकि मेरा कस्टम नियंत्रण थ्रेड शुरू करने की कोशिश कर रहा था ('DesignMode' प्रॉपर्टी काम नहीं करती है, [यह समाधान] देखें (http://stackoverflow.com/questions/39648/good-way-to-debug -visual-स्टूडियो डिजाइनर त्रुटियों))। मुझे डिज़ाइन-टाइम व्यवहार को डिबग करने के तरीके पर [इस आलेख] (http://msdn.microsoft.com/en-us/library/ms996457.aspx) के माध्यम से यह पता चला। – pelesl

उत्तर

4

मुझे पता चला है कि क्या हो रहा है। सरल उदाहरण और वास्तविक चीज़ के बीच का अंतर यह तथ्य है कि इसमें एक एडइन शामिल है। यह काफी लॉग कहानी है, लेकिन यह है।
आप कोड नमूने से देख सकते हैं, मैं क्रम में प्रतिबिंब के माध्यम से ConfClasses DLL लोड इसे करने के लिए एक संदर्भ जोड़ने के लिए से बचने के लिए। रनटाइम पर यह ठीक है, लेकिन डिजाइनर शिकायत करता है कि यह आईसीओएनएफ को आईसीओएनएफ में डालने में सक्षम नहीं है। यह तब होता है जब डिजाइनर शुरू होता है क्योंकि CoreClasses.dll AppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ ProjectAssemblies से भरी हुई है, लेकिन ConfClasses.dll मेरी बिन फ़ोल्डर से भरी हुई है और इसलिए इसके संदर्भ हैं रहा है, इसलिए CoreClasses.dll के दो संस्करणों देखते हैं और आईसीओएनएफ के विभिन्न संस्करणों। जब पिछले डिजाइनर विंडो बंद हो
समस्या मैं एक ऐडइन, कि जब एक विधानसभा डिजाइन समय में Assembly.Load साथ भरी हुई है, कि विधानसभा के लिए एक संदर्भ कहते हैं, और उसके बाद विकसित बायपास करने के लिए संदर्भ साफ।
सब कुछ VS2005 के साथ ठीक था, लेकिन ProcMon.exe का उपयोग करके मुझे पता चला कि VS2010 ने एक नया फ़ोल्डर जोड़ा है जहां एडिन असेंबली की तलाश में हैं: प्रोग्राम फ़ाइलें (x86) \ माइक्रोसॉफ्ट विजुअल स्टूडियो 10.0 \ Common7 \ IDE \ CommonExtensions \ DataDesign
मैंने वहां अपनी असेंबली की प्रतिलिपि बनाई और सबकुछ फिर से काम करता है। अब यह केवल चीजों को मैन्युअल रूप से जोड़ने का तरीका खोजने का मामला है।

2

क्या आपने असेंबली को लोड करने में विफलता की जांच करने के लिए असेंबली बाध्यकारी लॉग व्यूअर का उपयोग करने का प्रयास किया है?

http://msdn.microsoft.com/en-us/library/e74a18c4%28v=vs.71%29.aspx

एक और लेख यहाँ इसे प्रयोग के बारे में बताया गया है:

http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx

संपादित करें:

DLL के कहाँ जमा होती हैं? यह forum post एक समान समस्या का विवरण देता है और समस्या डीएलएल को संदर्भित नहीं किया जा रहा है, जो कि जीएसी, निष्पादन योग्य निर्देशिका या निष्पादन योग्य निर्देशिका से उप-फ़ोल्डर में नहीं है:

+0

मैं सवाल का FusionLog जोड़ा है, लेकिन यह ... –

+0

सभी अपनी परियोजनाओं आउटपुट पथ के रूप में स्थापित एक ही फ़ोल्डर है मेरे लिए बहुत मतलब नहीं है, इसलिए सभी DLLs एक ही फ़ोल्डर है, जो स्पष्ट रूप से नहीं है में हैं विजुअल स्टूडियो में से एक। असेंबली इस फ़ोल्डर से लोड नहीं हैं, लेकिन एक प्रतिलिपि जो AppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ ProjectAssemblies के उपफोल्डर्स में बनाई गई है, और यहां मैं उन सभी को ढूंढ सकता हूं। –