मैंने असेंबली की गतिशील लोडिंग और उन विधानसभाओं से कक्षा के उदाहरण बनाने के लिए कोड का एक छोटा सा टुकड़ा लिखा है, जिसमें निष्पादन योग्य, गतिशील रूप से लोड होने के लिए एक परीक्षण lib और एक नई लाइब्रेरी में गतिशील असेंबली लोड करने के लिए लोडर लाइब्रेरी Appdomain
। लोडर लाइब्रेरी को निष्पादन योग्य और गतिशील लाइब्रेरी दोनों द्वारा संदर्भित किया जाता है।लोडरऑप्टिमाइजेशन का प्रभाव
//executable
[System.STAThreadAttribute()]
[System.LoaderOptimization(LoaderOptimization.MultiDomain)]
static void Main(string[] args)
{
AppDomainSetup domainSetup = new AppDomainSetup()
{
ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile,
ApplicationName = AppDomain.CurrentDomain.SetupInformation.ApplicationName,
LoaderOptimization = LoaderOptimization.MultiDomain
};
AppDomain childDomain = AppDomain.CreateDomain("MyDomain", null, domainSetup);
Console.WriteLine(AppDomain.CurrentDomain.SetupInformation.LoaderOptimization.ToString());
Console.WriteLine(childDomain.SetupInformation.LoaderOptimization.ToString());
byte[] assembly = null;
string assemblyName = "CSTestLib";
using (FileStream fs = new FileStream(assemblyName+".dll",FileMode.Open))
{
byte[] byt = new byte[fs.Length];
fs.Read(byt,0,(int)fs.Length);
assembly = byt;
}
object[] pararmeters = {assemblyName,assembly};
string LoaderAssemblyName = typeof(AssemblyLoader).Assembly.FullName;
string LoaderClassName = typeof(AssemblyLoader).FullName;
AssemblyLoader assloader = (AssemblyLoader)childDomain.CreateInstanceAndUnwrap(LoaderAssemblyName,LoaderClassName , true, BindingFlags.CreateInstance, null, parameters, null, null);
object obj = assloader.Load("CSTestLib.Class1");
object obj2 = assloader.Load("CSTestLib.Class2");
AppDomain.Unload(childDomain);
Console.ReadKey();
}
//Dynamic Lib
using System;
namespace CSTestLib
{
public class Class1 :MarshalByRefObject
{
public Class1() { }
}
public class Class2 : MarshalByRefObject
{
public Class2() { }
}
}
//Loader Library
using System;
namespace LoaderLibrary
{
public class AssemblyLoader : MarshalByRefObject
{
string assemblyName;
public AssemblyLoader(string assName, byte[] ass)
{
assemblyName = assName;
AppDomain.CurrentDomain.Load(ass);
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + " " + AppDomain.CurrentDomain.SetupInformation.LoaderOptimization.ToString());
}
public object Load(string className)
{
object ret = null;
try
{
ret = AppDomain.CurrentDomain.CreateInstanceAndUnwrap(assemblyName, className);
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
return ret;
}
}
}
यहाँ मैं
LoaderOptimizationAttribute
main()
विधि पर सेट लेकिनAppDomain.CurrentDomain.SetupInformation.LoaderOptimization.ToString();
कहना है कि वहNotSpecified
क्यों है?MultiDomain
औरMultiDomainHost
के बीच अंतर मुझे इतना स्पष्ट नहीं है। केवल जीएसी असेंबली के लिएMultiDomainHost
है? मेरी स्थिति के लिए जो अधिक उपयुक्त है?-
JIT संकलित कोड के अनुसार, विधानसभाओं लोड से संदर्भ में लोड के लिए साझा नहीं किया जा सकता की LoadFrom विधि विधानसभा वर्ग का उपयोग कर, या भार के का उपयोग कर छवियों से भरी हुई लोड विधि जो बाइट सरणी निर्दिष्ट करती है।
तो मैं अगर एक विधानसभा डोमेन तटस्थ या नहीं भरी हुई है कैसे पता लगा सकते हैं? मैं कैसे आश्वस्त कर सकता हूं कि यह डोमेन-तटस्थ लोड है?
ऐसा लगता है कि विशेषता वास्तव में प्रभाव डालती है। डीबगर संलग्न रिटर्न के साथ चल रहा है 'निर्दिष्ट नहीं किया गया' ... डीबगर रिटर्न के बिना चल रहा है 'मल्टीडोमेन' ... शायद कोई इसकी पुष्टि कर सकता है। – Matthias