【背景】

很多时候,我们在开发.net程序时,引用了NuGet包。但有时,因为包服务器或包作者原因,出现.Net程序包失效,找不到程序包导致NuGet 包还原失败的问题。

这时,项目 XXX突然报错,找不到原引用的程序包:如:“BKEDV.CommandLineParser.1.0.4”。

如再加载、编译项目时,老出警告,烦!

【摘要】

解决方法是:反编译包引用中的.dll文件为新项目,再引用新项目,去除原项目中的包引用。

【错误提示】

如下:

错误项目 XXX 的 NuGet 包还原失败: 找不到“1.0.4”版本的程序包“BKEDV.CommandLineParser”。

(YourDiskNo):\Program Files (x86)\Microsoft SDKs\NuGetPackages\: 在源“(YourDiskNo):\Program Files (x86)\Microsoft SDKs\NuGetPackages\”上找不到包“BKEDV.CommandLineParser.1.0.4”。

​https://api.nuget.org/v3/index.json:​​​ 在源“​​https://api.nuget.org/v3/index.json​​”上找不到包“BKEDV.CommandLineParser.1.0.4”。

开始时怀疑是包源服务器的问题,于是在VS设置中增加NuGet服务器地址:

​https://www.nuget.org/api/v2/index.json:​

依然报:无法加载源 ​​https://www.nuget.org/api/v2/index.json​​ 的服务索引。

响应状态代码不指示成功: 404 (Not Found)。

请查看“错误列表”窗口了解详细警告和错误。

【解决】

找到之前的引用包中.dll文件所在路径:

  1. 使用.NET Reflector 10.3反编译包引用中的.dll文件,如:CommandLineParser.dll文件,生成相关源代码。如运气差点,可能会报一些错误。没关系,Continue...
  2. 再使用dnSpy反编译,生成相关源码。
  3. 综合上述第1、2步的相关结果,排除相关错误,OK。
  4. 新建项目(如:CommandLineParser),将第3步中结果导入项目,重新在您的XXX项目中引用现有项目,如:CommandLineParser。
  5. 去除源项目中的包引用。打开源项目中的packages.config文件,将包引用的XML中<packages>节内整个package使用<!-- 引用XML段 -->隐藏(见红色文字部分):
<packages>
<!-- package id="BKEDV.CommandLineParser" version="1.0.4.0" targetFramework="net40" / -->
<package id="SharpVectors.Reloaded" version="1.2.0" targetFramework="net40" />
</packages>

完成,不再提示错误。