2012-09-07 13 views
8

मैं क्रम की असेंबली लोड करने के लिए कोशिश कर रहा हूँ, और मैं कारण है कि मैं विधानसभा में एक प्रकार का एक उदाहरण स्थिर का उपयोग नहीं बना सकते हैं के रूप में अनिश्चित हूँ Activator.CreateInstance()। यह Assembly.CreateInstance() के साथ काम करता है।लोड हो रहा है विधानसभाओं और उदाहरणों बनाने Activator.CreateInstance() का उपयोग कर

string assemblyFilename = "MyAssembly.dll"; 
string assemblyName = "MyAssembly"; 
string typeName = "MyAssembly.MyType"; 

FileInfo fileInfo = new FileInfo(assemblyFilename); 

यह काम करता है:

var assembly = Assembly.LoadFrom(assemblyFilename); 
Form form = (Form)assembly.CreateInstance(typeName); 

लेकिन यह काम नहीं करता:

Assembly.LoadFrom(assemblyFilename); 
Form form = (Form)Activator.CreateInstance(assemblyName, typeName).Unwrap(); 

FileNotFoundException फेंका:

फ़ाइल या विधानसभा 'MyAssembly' लोड नहीं कर सका या एक इसके dependenc का एँ। सिस्टम निर्दिष्ट फाइल का पता लगाने में नाकामयाब रहा।

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

दोनों मामलों में, Assembly.LoadFrom() कॉल के बाद, मैं देख सकता हूँ कि जब मैं AppDomain.CurrentDomain.GetAssemblies() में देखो मेरी विधानसभा लोड किया गया है।

AppDomain.CurrentDomain.Load(File.ReadAllBytes(assemblyFileName)); 

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

+1

दूसरे संस्करण को एक पूर्ण असेंबली नाम निर्दिष्ट करना चाहिए, न केवल प्रदर्शन नाम, और हुड के नीचे विधानसभा.लोड() का उपयोग करना चाहिए। LoadFrom() के समान नहीं है। Fuslogvw.exe –

+0

के साथ समस्या निवारण "MyAssembly, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = 5dc3e20777fed081" के रूप में? मुझे एक ही त्रुटि मिलती है – davenewza

+0

मैंने GetAssemblies() में सीधे "MyAssembly" से पूर्ण नाम की प्रतिलिपि बनाई है और यह अभी भी काम नहीं करता है। इतनी उलझन! – davenewza

उत्तर

2

आप पहली बार अपने वर्तमान AppDomain में विधानसभा लोड करने के लिए है के साथ अपनी फ़ाइल समायोजित कर सकते हैं इस काम करता है?

Form form = (Form)Activator.CreateInstance(Type.GetType(typeName)) 
+0

पोस्ट करने के लिए कोड जोड़ा मुझे एक ही समस्या मिलती है। यदि मैं 'AppDomain.CurrentDomain.GetAssemblies()' विधानसभा के बाद'LoadFrom() 'में देखता हूं तो मैं देख सकता हूं कि मेरी असेंबली दोनों मामलों में लोड की गई है। – davenewza

+1

@davenewza यह देखने के लिए मेरे संपादन की जांच करें कि क्या यह काम करता है –

+0

यह नहीं करता है। मुझे 'Type.GetType() 'पर" मान शून्य नहीं हो सकता "मिलता है। – davenewza

3

आप अपने पथ

var path = Assembly.GetAssembly(MyType.GetType()).Location; 
var thisAssembly= Assembly.LoadFrom(path); 

var TypeName = ""; 
Type type = thisAssembly.GetType(TypeName); 
object instance = Activator.CreateInstance(type); 
+0

मुझे एक्टिवेटर.क्रेट इंस्टेंस() का उपयोग करने की आवश्यकता है क्योंकि मेरे पास हमेशा उपलब्ध असेंबली का उदाहरण नहीं होगा। – davenewza

+1

@davenewza मैंने –

1

मूल उत्तर संपादित करने का प्रयास किया लेकिन मुझे लेखक से कोई प्रतिक्रिया नहीं मिली। तो बस मामले में कुछ भी इस की जरूरत है, यहाँ कोड है कि मुझे

System.Reflection.Assembly assembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes("DLL_PATH")); 
Form form = (Form)assembly.CreateInstance("FullNameSpace.ClassName"); 
0

के लिए काम किया एक Khudairy का जवाब यहाँ इनपुट पैरामीटर में पारित एक विशिष्ट निर्माता का उपयोग करने की अनुमति देने के लिए, के साथ साथ उसके जवाब के इस बदलाव का एक बदलाव का समाधान है एक समस्या जो मैंने किया है और सचमुच कई हफ्तों के लिए खोज और बंद कर रहा है, अब हल करने की कोशिश कर रहा है (उत्तर साझा करने के लिए उसे कई कुडोस)।

मेरे समस्या मैं एक नया आवेदन जो .NET 4.6 था में एक .NET 3.5 DLL लोड करना चाहता था, लेकिन उन पुराने dll का इस्तेमाल किया तीसरे पक्ष के नियंत्रण जो कैस नीति का उपयोग करने के देखा। मुझे तीसरे पक्ष के नियंत्रण से एक त्रुटि मिलेगी, जिसमें कहा गया है कि मुझे app.config में बदलने की ज़रूरत है, अगर मैंने ऐसा किया तो मैं फ़ाइलों को लोड और चलाने के लिए ठीक कर सकता था अगर वे मेरे स्थानीय कंप्यूटर पर थे, लेकिन अगर मैंने उन्हें लोड करने का प्रयास किया एक नेटवर्क ड्राइव, जो मुझे करने की ज़रूरत है, तो मुझे एक फ़ाइल IOPermission त्रुटि मिली।

loadFromRemoteSources और useLegacyV2RuntimeActivationPolicy साथ NetFx40_LegacySecurityPolicy के संयोजन चल की कोशिश की, और इस तरह के Activator.CreateInstance() जो आम तौर पर मेरे लिए काम करता के रूप में कई अलग अलग तरीकों की कोशिश की, एकसैंडबॉक्स बनाने (हालांकि मैं अगर मैं इसे ठीक से किया था पता नहीं है) की कोशिश की, लेकिन नीचे के अलावा, कुछ भी काम नहीं करेगा। ध्यान दें, मेरे उपयोगकर्ता नियंत्रण बेस क्लास के आधार पर भी आधारित थे। मैंने नेटवर्क ड्राइव तक पहुंच प्रदान करने से पहले कुछ सीएएस कमांड प्रॉम्प्ट कमांड चलाए थे, और मेरा ऐप पूर्ण ट्रस्ट में चलना चाहिए। भले ही, यह मेरे द्वारा अभी तक किए गए कार्यों के अलावा किसी भी तरीके की तरह नहीं देखा गया था।

कोड फिक्स:

object dllUserControl = null; 
System.Reflection.Assembly assembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes("DLL_PATH")); 
dllUserControl = assembly.CreateInstance("FullNameSpace.ClassName",true,BindingFlags.Default,null,constructorParams[],null,null); 

... जहाँ से मैं बाद में (मेरी आधार वर्ग के लिए) की जरूरत के रूप में बाद में उसके अपने फार्म/विंडो में लॉन्च करने के लिए वस्तु डाली सकता है।

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