c# 动态加载dll时 有参构造 和 方法重载问题

tommir3 2010-01-19 09:19:43

string path = System.IO.Directory.GetCurrentDirectory(); //获得当前项目所在的据对路径
Assembly ass = Assembly.LoadFile(path + "\\lassLibrary1Demo.dll"); //获取DLL的集合

Type tp = ass.GetType("lassLibrary1Demo.Sample1"); //获得DLL中的指定类型
object tmpobj = ass.CreateInstance(//这里的参数怎么写?); //获得DLL中指定类的实例



public class Sample1
{
private string _str1;

public Sample1(string s)
{
_str1 = s;
}

/// <summary>
/// 显示
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public string Display()
{
return "默认方法";
}

/// <summary>
/// 显示
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public string Display(string s)
{
return s + "————添加后的元素";
}
}


1、现在的问题是,在调用有参构造时不知道如何调用?MSDN没用例子,文字叙述不是很明白。

2、还有就是如果调用的方法为重载的方法,调用出错,不知如何能解决调用重载方法?
...全文
149 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tommir3 2010-01-19
  • 打赏
  • 举报
回复
结贴了。。。
调用重载方法的问题一直没人会。。。
现在又碰到个问题,
如果调用DLL中的方法中,返回类型为类或者借口,
如何解决。。
我另开一贴子问,
结贴给分先。。。
laptop8000 2010-01-19
  • 打赏
  • 举报
回复
学习
mngzilin 2010-01-19
  • 打赏
  • 举报
回复
object tmpobj = ass.CreateInstance("lassLibrary1Demo.Sample1", false, BindingFlags.CreateInstance, null, new object[] { },null,null);
blackice8 2010-01-19
  • 打赏
  • 举报
回复
楼上写的很清楚了;
这个是msdn 的 AppDomain用例,可以参考看看
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Reflection;
namespace UnloadDll
{
class Program
{
static void Main(string[] args)
{
string callingDomainName = AppDomain.CurrentDomain.FriendlyName;//Thread.GetDomain().FriendlyName;
Console.WriteLine(callingDomainName);
AppDomain ad = AppDomain.CreateDomain("DLL Unload test");
ProxyObject obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(@"UnloadDll.exe", "UnloadDll.ProxyObject");
obj.LoadAssembly();
obj.Invoke("TestDll.Class1", "Test", "It's a test");
AppDomain.Unload(ad);
obj = null;
Console.ReadLine();
}
}
class ProxyObject : MarshalByRefObject
{
Assembly assembly = null;
public void LoadAssembly()
{
assembly = Assembly.LoadFile(@"TestDLL.dll");
}
public bool Invoke(string fullClassName, string methodName, params Object[] args)
{
if(assembly == null)
return false;
Type tp = assembly.GetType(fullClassName);
if (tp == null)
return false;
MethodInfo method = tp.GetMethod(methodName);
if (method == null)
return false;
Object obj = Activator.CreateInstance(tp);
method.Invoke(obj, args);
return true;
}
}
}

tommir3 2010-01-19
  • 打赏
  • 举报
回复

string path = System.IO.Directory.GetCurrentDirectory(); //获得当前项目所在的据对路径
Assembly ass = Assembly.LoadFile(path + "\\lassLibrary1Demo.dll"); //获取DLL的集合
Type tp = ass.GetType("lassLibrary1Demo.Sample1"); //获得DLL中的指定类型
object tmpobj = ass.CreateInstance("lassLibrary1Demo.Sample1", false, BindingFlags.CreateInstance, null, new object[] { "12345" }, null, null); //获得DLL中指定类的实例
string classAttribute = (string)tp.InvokeMember("Str1", BindingFlags.DeclaredOnly | BindingFlags.Public
| BindingFlags.NonPublic | BindingFlags.Instance
| BindingFlags.GetProperty, null, tmpobj, null);
Console.WriteLine(classAttribute);
//这里在调用重载方法时出错
MethodInfo mi = tp.GetMethod("Display"); //取的方法描述
string result = (string)mi.Invoke(tmpobj, new object[] { "abc" }); //调用的对象,以及参数
Console.WriteLine(result); //把演示结果打印出来
Console.Read();



public class Sample1
{
private string _str1;

public Sample1(string s)
{
_str1 = s;
}

/// <summary>
/// 显示
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public string Display()
{
return "默认方法";
}

/// <summary>
/// 显示
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public string Display(string s)
{
return s + "————添加后的元素";
}
}

tommir3 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xray2005 的回复:]
  object tmpobj = ass.CreateInstance(tp, true, BindingFlags.CreateInstance, null, new object[] { 参数1, 参数N }, null, null);
[/Quote]

谢谢,我参数传错一个.....
传成BindingFlags.Instance这个了.....
是创建实例....
谢谢你

能告诉下调用重载方法怎么调用吗?
ILOVE_ASPNET 2010-01-19
  • 打赏
  • 举报
回复
up
xray2005 2010-01-19
  • 打赏
  • 举报
回复
object tmpobj = ass.CreateInstance(tp, true, BindingFlags.CreateInstance, null, new object[] { 参数1, 参数N }, null, null);
  • 打赏
  • 举报
回复
mark

111,123

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧