在运行时更改.dll
本文关键字:dll 运行时 | 更新日期: 2023-09-27 18:33:31
我有一个巨大的应用程序,我的解决方案的一个项目可以制作报告。我想在不构建项目的情况下添加新报告(更新报告),只需添加.dll
文件即可。我读了关于Assembly
和 AppDomain
,但我不知道为新报告添加新的dll以及如何在运行时更新旧报告是否真的好方法?这是我的例子,它需要我的第一个dll,但第二次不需要。第一个 dll - 总和,第二个 - 扣除。
static void Main(string[] args)
{
try
{
//first domain
AppDomain domain = AppDomain.CreateDomain("MyDomain");
AssemblyDll asb1 = new AssemblyDll();
Console.WriteLine(asb1.AssemblyMethod(1));
AppDomain.Unload(domain);
Console.ReadKey();
//second domain
AppDomain newDomain = AppDomain.CreateDomain("myNewDomain");
AssemblyDll asb2 = new AssemblyDll();
Console.WriteLine(asb2.AssemblyMethod(2));
AppDomain.Unload(newDomain);
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
public class AssemblyDll
{
public string AssemblyMethod(int version)
{
//loading .dll
Assembly assembly = Assembly.LoadFrom(@"../../../../Assembly/DynamicDLL" + version + ".dll");
Type type = assembly.GetType("DynamicDLL.Dynamic");
object instance = Activator.CreateInstance(type);
MethodInfo[] methods = type.GetMethods();
//invoke method
object result = methods[0].Invoke(instance, new object[] { 5, 3 });
return result.ToString();
}
}
我的.dll文件来自:
namespace DynamicDLL
{
public class Dynamic
{
public int DynamicMethod(int a, int b)
{
return a + b;
//return a - b;
}
}
}
如果你想
写一些像插件和插件方法的东西,你应该看看MEF http://msdn.microsoft.com/en/library/vstudio/dd460648.aspx
MEF 允许您动态使用任何程序集,甚至可以将 dll 放入文件夹中并从中生成 MEF 目录。
实际上是Visual Studio,并在内部使用MEF进行扩展(插件...
程序集
通常加载到AppDomain
一次,加载后无法卸载它们。
您可以创建一个新AppDomain
并将程序集加载到其中,当您释放此程序集时,程序集将被卸载。但是,这里需要注意的是,您不能直接在两个之间通信,AppDomain
您必须使用其他方法(如远程处理)在两者之间进行封送。
关于插件和使插件不可加载的文章很多,快速的谷歌搜索提供了这些:
http://www.brad-smith.info/blog/archives/500
http://adrianvintu.com/blogengine/post/Unloadable-plugins.aspx
希望这些对您有所帮助。