在net中加载DLL时如何实现变量初始化

本文关键字:实现 初始化 变量 何实现 net 加载 DLL | 更新日期: 2023-09-27 17:49:26

使用反射使动态加载DLL如何在启动时实现变量初始化?

 private bool loadPlugins( string path )
        {
            try
            {
                string[] pluginFiles = Directory.GetFiles(path, "*.dll");
        plugins = new List<IPlugin>();
        for ( int i = 0; i < pluginFiles.Length; i++ )
        {
            string args = pluginFiles[i].Substring(pluginFiles[ i ].LastIndexOf( "''" ) + 1, pluginFiles[ i ].IndexOf( ".dll" ) -
                pluginFiles[ i ].LastIndexOf( "''" ) - 1 );
            Type ObjType = null;
            try
            {
                Assembly ass = null;
                AssemblyName myAssemblyName = AssemblyName.GetAssemblyName(pluginFiles[i].ToString());
                ass = Assembly.Load(myAssemblyName/*args*/);
                var s = ass.FullName;
                if ( ass != null )
                {
                    ObjType = ass.GetType(args + ".PlugIn");
                }
            }
            catch
            {
                continue;       //если плагин корявый переходим к следующей итерации;
            }
            try
            {
                if ( ObjType != null )
                {
                    plugins.Add( (IPlugin)Activator.CreateInstance( ObjType ) );
                    plugins[ plugins.Count - 1 ].Host = this;
                }
            }
            catch
            {
                return true;
            }
        }

在net中加载DLL时如何实现变量初始化

我认为你混淆了实例和Assembly。我相信您正在尝试设置此程序集中某些类中的变量值。现在,只有在创建所述类的实例时,变量才会存在。

如果你看一下Assembly.CreateInstance方法,它也允许你设置值。但是,这些只能是构造函数参数。如果这些是构造函数参数之外的变量,您可以使用如下方式:

Assembly assembly = Assembly.Load("AssemblyName");
        Type objectType = assembly.GetType("TypeName");
        object dynamicObject = Activator.CreateInstance(objectType);
        objectType.GetField("VariableName").SetValue(dynamicObject, "FieldValue");