猿问

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

情况如下:

现有三个程序集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:
您有何高见说来听听撒,俺这儿等着呢……
慕尼黑5688855
浏览 1416回答 3
3回答

天涯尽头无女友

只好在Main.exe运行的时候先把Two.dll复制到One.dll调用的绝对路径下。然后再Assembly a.dll。Main.exe退出的时候,再删除这个临时的Two.dll的绝对路径中的文件和文件夹。

智慧大石

程序集是一个 DLL,你想使用其中的类,就必须要将该DLL文件添加到你的项目中。一个程序集包括一个或多个命名空间。举例来说,命名空间 System.Data 来自文件System.Data.DLL,命名空间System.Data.SqlClient 同样来自 System.Data.DLL,所以,这意味着你一旦添加了 System.Data 程序集文件的引用(无论你是从 GAC添加还是直接添加的 DLL 到项目),你就可以使用 System.Data 和System.Data.SqlClient 下的各种类。那为什么要 using呢?简单地说,你甚至可以不用写一个using,凡是需要用到类型的地方用完全限定名。什么是完全限定名?比如数据集类 DataSet:System.Data.DataSet 就是它的完全限定名。比如数据库连接类 SqlConnection:System.Data.SqlClient.SqlConnection 就是它的完全限定名。用了 using 的好处在于:你不必处处写完全限定名,这样会使代码看起来过于冗长。说到这里,using 的作用明白了吗?其实就是起到了简写的作用。真正的引用工作是一开始做的,using 只是为了使你的后续编码工作简单而易。
随时随地看视频慕课网APP

相关分类

Python
我要回答