C# 程序集查找规则及项目中nuget包中的dll的管理

现在有一个项目A,需要通过nuget包引入一些dll,如何处理引入的dll分两种情况:
前提,nuget包所在的packages目录 文件夹无论如何都要上传。
1、项目A生成目录输出在bin/Debug(Release)及应用程序根目录下
此时,Nuget包引入的dll,复制到本地,保持默认的True即可,因为这些dll会跟随项目A.dll一起被复制到应用程序根目录下
2、项目A生成目录输出在bin/debug(release)/xxx/项目A.dll
这时,nuget包引入的dll,
2.1、复制到本地的属性 需要改成False;
2.2、 nuget引入的dll需要上传到Bin/Debug(Release)下面;
因为,如果如果保持默认,即:复制到本地选项为True,那么nuget引入的这些dll会随项目生成在bin/debug(release)/xxx/项目A.dll,所在的同一个文件夹中。(这样不好,后续会提到)
3、其它项目B想要使用项目A引入的nuget包中的dll;那项目B需要再引入一次nuget包么?
答案是,不需要也不能够,
先说不能够,在同一个工程下存在两份nuget,将来大概率会受到版本不一致带来维护成本的困扰
再说不需要,A项目引入了nuget包后,它必然将nuget包上传了,并且可能也上传到了bin/Debug(Release)一份
此时B需要做的就是:
3.1、看A项目引用的nuget包中的dll中的位置,把路径拷一份,然后添加引用,浏览这个路径对应的dll,引入进来;
3.2、将复制到本地设置为False.
4、最后提一下,为什么说2.1那里要改成False,因为一旦你把nuget中的dll复制到自己的目录下,那当其他人在操作3.1步骤时,还要依赖你这个项目有没有被编译,这可能又滋生了生成顺序的问题。所以不要把nuget包中的dll,生成在自己项目的私有目录下是一个好习惯。

5、应用程序加载我们需要的dll时,它是怎么工作的:

  • 先从主程序配置文件中查找app.config
  • 上一步未找到 则从全局环境(dotnet framework v4.6.x)中查找,比如微软提供的System.xxx.dll就是这样加载进来的
  • 上一步未找到 则从应用程序根目录下查找
  • 若还没找到 则抛出异常 (若未做其它补救措施 即:在代码中动态加载程序集dll),程序崩溃:
    报错信息大致为:未能加载文件或程序集 xxxxxxxx或它的某一个依赖项。系统找不到指定的文件。

目前还没有提及从第三方获取的dll,如何管理的问题,新开一篇再记录,bye!

posted @ 2025-08-15 14:33  BigBosscyb  阅读(30)  评论(0)    收藏  举报