为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑5688855 2019-04-14 12:08:04
情况如下:现有三个程序集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:您有何高见说来听听撒,俺这儿等着呢……
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

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

查看完整回答
反对 回复 2019-04-15
?
智慧大石

TA贡献1946条经验 获得超3个赞

程序集是一个 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 只是为了使你的后续编码工作简单而易。

查看完整回答
反对 回复 2019-04-15
  • 3 回答
  • 0 关注
  • 1415 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信