在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;
}
}
我认为你混淆了实例和Assembly
。我相信您正在尝试设置此程序集中某些类中的变量值。现在,只有在创建所述类的实例时,变量才会存在。
如果你看一下Assembly.CreateInstance
方法,它也允许你设置值。但是,这些只能是构造函数参数。如果这些是构造函数参数之外的变量,您可以使用如下方式:
Assembly assembly = Assembly.Load("AssemblyName");
Type objectType = assembly.GetType("TypeName");
object dynamicObject = Activator.CreateInstance(objectType);
objectType.GetField("VariableName").SetValue(dynamicObject, "FieldValue");