动态调用DLL时不能加载依赖的程序集
2009-07-03 17:39
246 查看
假设有2个DLL, Class1和Class2. Class1引用Class2, 并调用Class2里的方法。
Code
//Class1.Dll
namespace feiyun0112.cnblogs.com
{
public class Class1
{
public void DoSomething() { Class2.Hello(); }
}
}
//Class2.Dll
namespace feiyun0112.cnblogs.com
{
public class Class2
{
public static void Hello() { MessageBox.Show("Hello World!"); }
}
}
如果我们动态调用Class1里的方法,会报无法加载"Class2"的异常
Code
string path = @"C:/test/Class1.dll";
Assembly assembly = Assembly.LoadFile(path);
Type type = assembly.GetType("feiyun0112.cnblogs.com.Class1");
object obj = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("DoSomething", BindingFlags.Public | BindingFlags.Instance);
if (method != null)
{
method.Invoke(obj, null);
}
解决的方法其实也很简单,在对程序集的解析失败时, 会触发AppDomain.AssemblyResolve事件, 我么只需要在事件中进行处理,
将需要的Dll加载到应用程序域,动态调用的程序集就可以正常使用了。
Code
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
{
string strFielName = args.Name.Split(',')[0];
return Assembly.LoadFile(string.Format( @"C:/test/{0}.dll",strFielName));
}
Code
//Class1.Dll
namespace feiyun0112.cnblogs.com
{
public class Class1
{
public void DoSomething() { Class2.Hello(); }
}
}
//Class2.Dll
namespace feiyun0112.cnblogs.com
{
public class Class2
{
public static void Hello() { MessageBox.Show("Hello World!"); }
}
}
如果我们动态调用Class1里的方法,会报无法加载"Class2"的异常
Code
string path = @"C:/test/Class1.dll";
Assembly assembly = Assembly.LoadFile(path);
Type type = assembly.GetType("feiyun0112.cnblogs.com.Class1");
object obj = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("DoSomething", BindingFlags.Public | BindingFlags.Instance);
if (method != null)
{
method.Invoke(obj, null);
}
解决的方法其实也很简单,在对程序集的解析失败时, 会触发AppDomain.AssemblyResolve事件, 我么只需要在事件中进行处理,
将需要的Dll加载到应用程序域,动态调用的程序集就可以正常使用了。
Code
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
{
string strFielName = args.Name.Split(',')[0];
return Assembly.LoadFile(string.Format( @"C:/test/{0}.dll",strFielName));
}
相关文章推荐
- 动态调用DLL时不能加载依赖的程序集
- 动态调用DLL时不能加载依赖的程序集
- C#调用c++封装的dll文件提示未能加载正确的程序集XXX或其某一依赖项。。。
- 利用反射从程序集dll中动态调用方法
- C#实现反射调用动态加载的DLL文件中的方法
- asp.net动态加载程序集创建指定类的实例及调用指定方法
- vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法
- c# 创建DLL,动态加载dll文件,并调用其中的方法(转自CFEI.NET)
- SilverLight学习笔记--Silverligh之动态加载程序集(.DLL)
- C#实现反射调用动态加载的DLL文件中的方法
- C#利用反射动态调用DLL并返回结果,和获取程序集的信息
- 利用反射从程序集dll中动态调用方法(附demo下载)
- C#实现反射调用动态加载的DLL文件中的方法
- c# winform程序调用托管dll(c#的dll),使用"添加引用"和动态加载dll
- DLL的类库怎样实现动态加载调用
- C#利用反射动态加载DLL(C#)并调用其中的接口
- C#实现反射调用动态加载的DLL文件中的方法
- DLL的类库怎样实现动态加载调用
- C# 动态加载程序集dll (实现接口)
- 如何在托管程序中动态加载dll并且调用其中的函数