温馨提示:这篇文章已超过409天没有更新,请注意相关的内容是否还可用!
摘要:在C#中,当涉及到非强签名dll的搜索顺序时,系统首先会在本地目录和系统的路径中查找这些dll文件。如果在这些地方没有找到,它会转向系统的全局程序集缓存(GAC)进行搜索。环境变量路径也会被考虑在内。C#对非强签名dll的搜索顺序是本地目录、系统路径、GAC和环境变量路径。
预备工作
1、新建解决方案ClassLibrary1,并新建类库ClassLibrary1。
2、新建控制台程序ShowDllLoc。
利用VS添加引用
一,通过app.config设置codebase,设置dll的加载路径为codebaselibs\ClassLibrary1.dll。
二,设置私有目录为libs。
建立类库,其中包含一个函数:
public class Class1 { public static void ShowLoc() { Console.WriteLine(typeof(Class1).Assembly.Location); } }
建立控制台项目,主函数如下:
internal class Program { static void Main(string[] args) { Console.WriteLine("begin "); ClassLibrary1.Class1.ShowLoc(); Console.ReadKey(); } }
实验
1、在codebaselibs、exe所在目录、ClassLibrary1、libs目录各存放一个ClassLibrary1.dll,启动程序,结果显示优先加载codebase设置目录的dll。
2、删除codebaselibs目录的dll,启动程序,程序崩溃退出,如果设置了codebase只会在codebase目录寻找。
3、删除codebase设置,启动程序,结果优先加载 exe目录的dll。
4、删除exe所在目录的dll,启动程序,结果优先加载dll同名目录的dll。
5、删除ClassLibrary1目录的dll,启动程序,最后加载私有目录的dll。
动态加载
如果在多个目录都有dll,并且尝试动态加载dll,结果会根据目录的优先级来加载,测试发现,动态加载dll不会在codebase目录寻找,如果同时手动加载和自动加载,手动加载和自动加载的都会加载codbase目录的dll,但如果添加了引用,但没有调用此类库的函数,此dll并不会自动加载,手动加载不会影响自动加载,关于dllcalldll.dll引用另外一个dll的情况,无论exe是否配置codebase,dllcalldll.dll的codebase永远无效,可以通过修改ShowDllLoc.exe.config来临时修改codebase目录,关于C#动态加载dll的小技巧也一并进行了介绍。
需要注意的是测试环境为win7或win10操作系统,使用VS2019或VS2022开发环境,如无特殊说明,本算法用C++实现。 文中还提供了扩展阅读部分包括视频课程和相关资料的下载链接,最后想对读者说的话是:闻缺陷则喜是一个美好的愿望,早发现问题早修改问题可以给老板节约钱,子墨子言之:事无终始,无务多业,如果程序是一条龙,那算法就是它的眼睛,希望读者能够专注于专业的事,用算法为程序赋予更多的智慧。
还没有评论,来说两句吧...