C#中如何动态添加程序集查找目录

情况如下:现有三个程序集Main.exe,One.dll,Two.dll。其中One.dll引用了Two.dll,并且One.dll与Two.dll部署在一起,而Main... 情况如下:

现有三个程序集Main.exe, One.dll, Two.dll。其中One.dll引用了Two.dll, 并且One.dll与Two.dll部署在一起, 而Main.exe单独部署。

在One.dll中有
using Two;
namespace One
{
public SomeType
{
public void DoSomething(){ AnotherType.Hello(); }
}
}

在Two.dll中有
namespace Two
{
public AnotherType
{
public static void Hello(){}
}
}

Main.exe运行时,首先将One.dll与Two.dll安装到某一路径下,之后动态加载One.dll并调用一个方法
...
var path = "某路径\One.dll";
var assembly = Assembly.LoadFile(path);
var type = assembly.GetType("One.SomeType");
var obj = Activator.CreateInstance(type);
var method = type.GetMethod("DoSomething", BindingFlags.Public | BindingFlags.Instance);
if (method != null)
{
method.Invoke(obj, null);
}
...

现在问题是Main.exe在动态调用SomeType.DoSomething()时无法加载One.dll所依赖的Two.dll,因为One.dll,Two.dll与Main.exe是分开部署的,而且One.dll与Two.dll所在的路径是在Main.exe运行时动态确定的(例如由用户选择)。

请问如何可以使Main.exe在运行时可以自动在One.dll的所在目录中查找并加载Two.dll?
回δCat:
但是One.dll和Two.dll是别人已经shipped的,是不可以改的。改动只能在Main.exe中……

回a31232710:
您有何高见说来听听撒,俺这儿等着呢……
展开
 我来答
微软专家张海
2009-07-03 · TA获得超过748个赞
知道小有建树答主
回答量:564
采纳率:100%
帮助的人:0
展开全部
//调用之前绑定事件
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( @"某路径\{0}.dll",strFielName));
}
百度网友94f02eb
2009-07-03 · TA获得超过8612个赞
知道大有可为答主
回答量:7955
采纳率:74%
帮助的人:4473万
展开全部
在 one 调用 two 时,采用 和 main 调用 one 一样的方式,也是动态加载,就可以了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
历又
2009-07-03 · TA获得超过299个赞
知道小有建树答主
回答量:726
采纳率:100%
帮助的人:452万
展开全部
只好在Main.exe运行的时候先把Two.dll复制到One.dll调用的绝对路径下。
然后再Assembly a.dll。Main.exe退出的时候,再删除这个临时的Two.dll的绝对路径中的文件和文件夹。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式