免费咨询律师网站,茶叶企业网站建设,五一网站个人空间,南京鼓楼做网站由于不是强签名dll#xff0c;所以无效考虑全局程序集缓存 (GAC)。
预备工作
新建解决方案ClassLibrary1,新建类库ClassLibrary1,新建控制台程序ShowDllLoc。
利用VS添加引用。
一#xff0c;利用app.config设置codebase#xff0c;设置dll的加载路径为#xff1a;code…由于不是强签名dll所以无效考虑全局程序集缓存 (GAC)。
预备工作
新建解决方案ClassLibrary1,新建类库ClassLibrary1,新建控制台程序ShowDllLoc。
利用VS添加引用。
一利用app.config设置codebase设置dll的加载路径为codebaselibs\ClassLibrary1.dll 。 二利用app.config设置私有目录为libs。 ?xml version1.0 encodingutf-8 ? dependentAssemblyassemblyIdentity nameClassLibrary1cultureneutral /codeBase version1.0.0.0hrefcodebaselibs\ClassLibrary1.dll //dependentAssembly/assemblyBinding
/runtime建立一个类库只有一个函数 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(); } }
实验
一在codebaselibs、exe所在目录、ClassLibrary1、libs目录各存放一个ClassLibrary1.dll。 启动程序结果如下 begin C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\codebaselibs\ClassLibrary1.dll 结论优先加载codebase设置目录的dll。 二删除codebaselibs目录的dll。 启动程序程序崩溃退出。 结论如果设置了codebase只会在codebase目录寻找。 三删除codebase设置。 启动程序结果如下 begin C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\ClassLibrary1.dll 优先加载 exe目录的dll。 四删除exe所在目录的dll。 启动程序结果如下 begin C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\ClassLibrary1\ClassLibrary1.dll 优先加载dll同名目录的dll。 五删除ClassLibrary1目录的dll。 begin C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\libs\ClassLibrary1.dll 结论最后加载私有目录的dll。 动态加载 static void Main(string[] args) { Console.WriteLine(begin ); Assembly asm Assembly.Load(“ClassLibrary1”); Console.WriteLine(asm.Location); Console.ReadKey(); } 一4个目录都有dll。启动程序结果如下 begin C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\ClassLibrary1.dll 结论优先加载exe所在目录的dll。 二删除exe目录的dll。启动程序结果如下 begin C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\ClassLibrary1\ClassLibrary1.dll 结论优先加载和dll同名的目录。 三删除和dll同名目录的dll。启动程序结果如下 begin C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\libs\ClassLibrary1.dll 四删除私用目录的dll。启动程序结果如下 程序崩溃。 结论动态加载dll不会在codebase目录寻找。
自动加载会影响收到加载
如果同时手动加载和自动加载手动加载和自动加载的都会加载codbase目录。 测试VS版本VS2022或VS2019。 static void Main(string[] args) { Console.WriteLine(begin ); Assembly asm Assembly.Load(“ClassLibrary1”); ClassLibrary1.Class1.ShowLoc(); Console.WriteLine(asm.Location); Console.ReadKey(); } } begin C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\codebaselibs\ClassLibrary1.dll C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\codebaselibs\ClassLibrary1.dll 更换调用顺序也是如此 begin C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\codebaselibs\ClassLibrary1.dll C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\codebaselibs\ClassLibrary1.dll
如果添加了引用但没有调用此类库的函数此dll并不会自动加载。
手动加载不会影响自动加载
static void Main(string[] args) { Console.WriteLine(begin ); string strPathName AppDomain.CurrentDomain.BaseDirectory “libs2\ClassLibrary1.dll”; Assembly asm Assembly.LoadFile(strPathName); Console.WriteLine(asm.Location); ClassLibrary1.Class1.ShowLoc(); Console.ReadKey(); } 手动加载成功自动加载失败而崩溃。和是否设置codebase无关。
dllcalldll.dll引用另外一个dll
dllcalldll.dll和exe的app.config都配置了codebase那个有效。经测试,无论exe是否配置codebase, dllcalldll.dll的codebase永远无效。
小技巧
可以手动通过修改ShowDllLoc.exe.config来临时修改codebase目录。 C# 动态加载dll 扩展阅读
视频课程
有效学习明确的目标 及时的反馈 拉伸区难度合适可以先学简单的课程请移步CSDN学院听白银讲师也就是鄙人的讲解。 https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了为老板分忧请学习C#入职培训、C入职培训等课程 https://edu.csdn.net/lecturer/6176
相关
下载
想高屋建瓴的学习算法请下载《喜缺全书算法册》doc版 https://download.csdn.net/download/he_zhidan/88348653
我想对大家说的话闻缺陷则喜是一个美好的愿望早发现问题早修改问题给老板节约钱。子墨子言之事无终始无务多业。也就是我们常说的专业的人做专业的事。如果程序是一条龙那算法就是他的是睛
测试环境
操作系统win7 开发环境 VS2019 C17 或者 操作系统win10 开发环境 VS2022 C17 如无特殊说明本算法用**C**实现。