मैं इस सवाल के रूप में कई अलग अलग संस्करण पढ़ा है के रूप में स्टैक ओवरफ़्लो पर हैं, साथ ही 3 अलग गूगल खोजों के पहले पन्ने पर हर नीले लिंक ट्यूटोरियल्स के साथ-साथ एमएसडीएन (जो असेंबली निष्पादित करने से परे उथले प्रकार की तरह है)। मैं केवल ताओ को एक अच्छे परीक्षण मामले के रूप में काम करने के अपने प्रयासों के बारे में सोच सकता हूं, लेकिन मेरा विश्वास करो, मैंने एक साधारण स्ट्रिंग रिटर्न, एक डबल, पैरामीटर के साथ एक समारोह के साथ भी कोशिश की है। जो भी मेरी समस्या है, यह ताओ नहीं है।सी # गतिशील लोड हो रहा है/DLLs Redux की उतराई (AppDomain का उपयोग कर, निश्चित रूप से)
मूल रूप से मैं GLPlugin नाम स्थान में मेरी ड्रा वर्ग के एक testLibraryDomain.CreateInstance()
बनाना चाहते हैं।
namespace GLPlugin
{
public class DrawingControl : MarshalByRefObject
{
public DrawingControl()
{
Gl.glColor3f(1.0f , 0.0f , 0.0f);
//this is a test to make sure it passes
//to the GL Rendering context... success
}
}
}
वास्तव में कलम रंग बदल जाता है:
if(usePlugin)
{
AppDomain testLibraryDomain = AppDomain.CreateDomain("TestGLDomain2");
//What the heck goes here so that I can simply call
//the default constructor and maybe a function or two?
AppDomain.Unload(testLibraryDomain);
}
Gl.glBegin(Gl.GL_TRIANGLES);
मैं एक तथ्य यह है कि के लिए पता है। यह तब काम करता है जब मैं इसे static void Main(string args[])
एंट्री पॉइंट देता हूं और मैं testLibraryDomain.ExecuteAssembly(thePluginFilePath)
पर कॉल करता हूं या नहीं, प्रत्यक्ष निष्पादन एस्क्रिप्बल्स काम करेगा या नहीं, क्योंकि मुझे यकीन नहीं था कि जीएल कॉल इसे "शीर्ष स्तर" ऐपडोमेन के ओपनजीएल संदर्भ में "शीर्ष स्तर" में लाएगा। यह मुझे असेंबली को ओवरराइट करने और पेन कलर को दूसरी बार बदलने देता है। दुर्भाग्य से इसे निष्पादन योग्य प्रविष्टि बिंदु देने का अर्थ है कि एक पॉपअप कंसोल मुझे बाधित करता है और फिर चला जाता है। यह तब भी काम करता है जब मैं इसे परियोजना में संदर्भ देता हूं और एक नियमित GLPlugin.DrawingTool tool = new GLPlugin.DrawingControl()
बनाता हूं, या यहां तक कि someAssembly = Assembly.LoadFrom(thePluginFilePath)
(जो निश्चित रूप से और दुर्भाग्य से, असेंबली को ताला लगाता है, प्रतिस्थापन/पुनर्मूल्यांकन को रोकता है) बनाते हैं।
विभिन्न तरीकों की कोशिश की है मैं के किसी भी उपयोग करते हैं, मैं हमेशा "दिया विधानसभा नाम या उसके आधार कोड अमान्य है।" मिल मैं वादा करता हूं, यह मान्य है। जिस तरह से मैं इसे लोड करने की कोशिश कर रहा हूं, वह कुछ नहीं है।
एक बात मैं जानता हूँ कि मैं कमी कर रहा हूँ के रूप में मैं बता सकता हूँ, AssemblyName तर्क विधानसभा फाइल करने के लिए filepath नहीं है जहाँ तक testLibraryDomain.CreateInstance(string assemblyName , string typeName);
के लिए एक सही सेटअप है। क्या यह नामस्थान है, या यहां तक कि सिर्फ असेंबली नाम, यानी: GLPlugin
? यदि हां, तो मैं वास्तविक फ़ाइल कहां संदर्भित करूं? वहाँ कोई AppDomain.LoadFrom (कुछ Filename) नहीं है, हालांकि अगर वहाँ थे तो यह आसान होगा। इसके अतिरिक्त, बिल्ली क्या है, और स्ट्रिंग प्रकार नाम उस पर क्या है? मैं "Object"
में नहीं डालना चाहता हूं, क्या मैं ऑब्जेक्ट के उदाहरण के अलावा अन्य प्रकार नहीं बना रहा हूं? मैंने ऐपडोमेन की मौलिक समझ की कमी के साथ CreateInstanceAndUnwrap(... , ...)
भी कोशिश की है। आम तौर पर मैं ट्यूटोरियल्स के माध्यम से उलझन में काम कर सकता हूं और काम करने के लिए चीजें प्राप्त कर सकता हूं, भले ही मैं अक्सर "क्यों?" नहीं समझता ... यहां नहीं। आम तौर पर मेरे लिए छह अलग-अलग ट्यूटोरियल देखने में मददगार होता है ... इसलिए यहां फिर से नहीं, बल्कि इसलिए कि हर कोई मौलिक रूप से (या ऐसा प्रतीत होता है) दृष्टिकोण लेता है।
तो कृपया ईएलआई 5 ... मैं एक अलग ऐपडोमेन में एक डीएल से कक्षा का एक उदाहरण लोड करना चाहता हूं, शायद कुछ फ़ंक्शंस चलाएं, और इसे अनलोड करें। आखिरकार सूची के रूप में इन कार्यों की सूची बनाएं, आवश्यकतानुसार हटाएं/अपडेट करें ... मुझे उनके लिए भी तर्क पारित करने में सक्षम होना अच्छा लगेगा, लेकिन यह चरण 2 होगा। स्टैक ओवरव्लो के अनुसार, मुझे serializable
के बारे में जानना है जो मैं एक और दिन के लिए बंद कर देंगे। (मुझे कल्पना है कि आप मेरे उदाहरण से क्या समझने में सक्षम होंगे।)
लॉकिंग के बिना असेंबली लोड करने के लिए मुझे लगता है कि छाया प्रतिलिपि का उपयोग करना बेहतर है, http://msdn.microsoft.com/en-us/library/ms404279.aspx देखें। – Maarten
मैं आपके उदाहरण के बारे में उत्सुक हूं, संभवत: मौलिक ज्ञान की कमी के कारण ... यह नए शीर्ष लोड किए गए एस्प्लॉर्ड्स को 'apd' ऐपडोमेन में डिफ़ॉल्ट शीर्ष स्तर के बजाय "लागू" करता है? क्या यह सिर्फ आदेश में उल्लिखित है, जैसा कि आपने ऐपडोमेन बनाया है, तो इसके नीचे सब कुछ 'अनलोड() 'तक इसका हिस्सा है? इसके अलावा, महान लेख, हालांकि मेरे सिर से थोड़ा ऊपर है। मैंने इसका एक हिस्सा पढ़ा था जिसे फटकारा गया था और एक विज्ञापन साइट पर रखा गया था लेकिन पूरा लेख होना अच्छा लगता है। मैं आज के दौरान वास्तव में इसे सीखने की कोशिश करूंगा। इच्छा की तरह यह एक कार्यात्मक स्रोत फ़ाइल थी। – Adam
मुझे यकीन नहीं है कि मैं आपका प्रश्न समझता हूं, लेकिन मैं आज अपने पुराने आवेदन से कुछ उदाहरण और टिप्पणियों के साथ खेलने की कोशिश करूंगा। –