【问题标题】:'Could not load file or assembly. The system cannot find the file specified' - thrown after packaging .NET Framework NuGet package'无法加载文件或程序集。系统找不到指定的文件' - 打包 .NET Framework NuGet 包后抛出
【发布时间】:2021-06-26 20:54:42
【问题描述】:

我正在尝试打包一个引用另一个名为“TestDLL”的 DLL 的类库

目标是 .NET 框架 4.8,我正在使用 NuGet 包资源管理器来构建包。 我添加了一个 lib 文件夹和一个以目标框架命名的文件夹,其中我有主项目的 dll,然后是引用的 DLL,我称之为“TestDLL”

见下文:

这里是元数据(nuspec 内容),其中包含对 TestDLL.dll 的引用

    <?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/01/nuspec.xsd">
  <metadata>
    <id>Nexbotix.OCR</id>
    <version>1.0.7</version>
    <authors>Nexbotix.OCR</authors>
    <owners></owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package Description</description>
    <dependencies>
      <group targetFramework=".NETFramework4.8" />
    </dependencies>
    <references>
      <group targetFramework=".NETFramework4.8">
        <reference file="TestDLL.dll" />
      </group>
    </references>
  </metadata>
</package>

我从包资源管理器将它打包成一个 nupkg 文件。一切似乎都很好,因为我能够将 nuget 包导入到我的目标项目中而不会出错。然后,当我去运行代码时,如果我尝试从 TestDLL.dll 中引用一个对象,我会收到这个错误,指出无法找到引用 TestDLL.dll 的文件。

显然我构建 nuget 包文件结构的方式有问题。 我只是想在 .NET Framework 中打包一个类库,该类库本身引用另一个 DLL,该 DLL 对导入 nuget 包的任何项目都是可见的。谁能帮我指出正确的方向?

【问题讨论】:

  • TestDLL.dll 编译成什么框架版本,TestDLL 是用任何依赖项构建的?
  • TestDLL.dll 也被编译为 .NET Framework 4.8,是的,它确实有自己的程序集引用和 NuGet 包引用
  • 请在您的项目的程序集中分享您的 DLL 列表树的图片。
  • 尝试将 TestDll.dll 粘贴到 \build\net48 中,然后我认为您甚至不需要 Reference 元素
  • 将 TestDll.dll 放入 \build\net48 恐怕没有用

标签: c# .net visual-studio dependencies nuget


【解决方案1】:

我找到了发生这种情况的原因,并不是因为我在依赖管理中做错了什么。

反而是原来的开源项目出了问题。

我联系了存储库维护人员,他解释说这是一个已知的依赖关系问题,并且解决方案中的特定项目还需要引用依赖关系,直到问题得到解决。

感谢所有试图回答这个问题的人。非常感谢。

【讨论】:

    【解决方案2】:

    不确定 nuget 缓存是否导致此问题。请尝试以下步骤:

    1)卸载你的nuget包Nexbotix.OCR

    2) clean nuget caches 或者直接删除C:\Users\xxx\.nuget\packages下的所有文件

    3)当你用nuspec文件打包你的nuget项目时,我建议你应该删除

      <references>
          <group targetFramework=".NETFramework4.8">
            <reference file="TestDLL.dll" />
          </group>
        </references>
    

    你使用它时,它只会引用TestDLL.dllMyProject.dll 永远不会被添加到你的主项目中。这是我的测试结果。无论您在&lt;references&gt; 中指定哪个,它都只会安装那个。

    或者,您应该像这样将所有 dll 添加到 references 节点中:

     <references>
     <group targetFramework=".NETFramework4.8">
        <reference file="TestDLL.dll" />
        <reference file="MyProject.dll" />
      </group>
     </references>
    

    其实,如果你这样做太多,nuget会自动安装lib文件夹的所有内容,而不使用References节点。

    我使用的整个 nuspec 文件是这样的:

    <?xml version="1.0" encoding="utf-8"?>
    <package >
      <metadata>
        <id>xxx</id>
        <version>1.0.0</version>
        <title>me</title>
        <authors>me</authors>
        <owners>me</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <license type="expression">MIT</license>
        ....
        <tags>Tag1 Tag2</tags>
     <dependencies>
          <group targetFramework=".NETFramework4.8" />
        </dependencies>
      </metadata>
    <files>
    <file src="bin\Debug\TestDLL.dll" target="lib\net48" />
    <file src="bin\Debug\TestDLL.pdb" target="lib\net48" />
    <file src="bin\Debug\MyProject.pdb" target="lib\net48" />
    </files>
    </package>
    

    【讨论】:

      猜你喜欢
      • 2015-01-22
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 2020-07-08
      相关资源
      最近更新 更多