मुझे एक ढांचा मिला है जिसमें कई आधार वर्ग शामिल हैं जिन्हें कई ऐप्स विकसित करने के लिए प्राप्त किया जा सकता है। इन वर्गों में से 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 को इसका सामना करने का एक तरीका मिल गया है।
मैंने [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