测试我的NuGet包,"项目无法在对象浏览器中查看"包的错误,但包含DLL的错误

时间:2018-01-18 17:45:18

标签: .net nuget nuget-package .net-standard nuget-spec

我正在制作一个针对.Net Standard 1.3和.Net Fx 4.5的NuGet包。

要做到这一点,我有一个我的NetStandard版本代码的解决方案,经过高度测试,我将两个* .cs文件复制到一个针对Fx 4.5的重复项目 - 我不知道一个更好的方法来做到这一点。这是我第一次定位多个框架。

Solution structure

然后我有一个nuspec文件,看起来像这样(为了简洁起见,元数据已被剪断):

<?xml version="1.0"?>
<package>
  <metadata>
    <snip/>
  </metadata>
  <files>
    <file src="VillageSoftware.PathMatcher-NetFx45\bin\Release\VillageSoftware.PathMatcher-NetFx45.dll" target="lib\net45\VillageSoftware.PathMatcher.dll" />
    <file src="VillageSoftware.PathMatcher\bin\Release\netstandard1.3\VillageSoftware.PathMatcher.dll" target="lib\netstandard1.3\VillageSoftware.PathMatcher.dll" />
  </files>
</package>

我可以使用nuget pack VillageSoftware.PathMatcher.nuspec

成功打包

我最初使用本地(C:\)包源测试包,但后来将包推送到NuGet.org

为了测试,我创建了一个新的.Net Framework 4.5控制台应用程序,当我使用Install-Package或“管理NuGet软件包”安装我的软件包时窗口,参考出现了感叹号:

Package with error icon

双击参考会抛出一个错误消息框:

  

此项目无法在对象浏览器中查看,因为它不可用或尚未构建。请确保项目可用并已建成。

相反,如果我使用&#39;添加参考&#39;要将VillageSoftware.PathMatcher DLL直接添加到TestBed项目,它可以正常工作。

我的理论是包和主机项目之间的框架不匹配,但我不知道为什么!软件包打包很好,成功的Install-Package显示NuGet使用的是正确的lib,而不是NetStandard版本。我不认为我的lib有任何我在nuspec中遗漏的依赖。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

我可以回答它发生的事情。我继续将您的包安装到测试解决方案中。我看到你看到的结果相同,引用无效。然后我比较了安装后如何引用,然后手动删除并再次添加引用。

从我的csproj文件中,安装后(不工作):

    <Reference Include="VillageSoftware.PathMatcher, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL">
        <HintPath>..\packages\VillageSoftware.PathMatcher.1.0.1\lib\net45\VillageSoftware.PathMatcher.dll</HintPath>
    </Reference>

手动安装(工作)后:

    <Reference Include="VillageSoftware.PathMatcher">
        <HintPath>..\packages\VillageSoftware.PathMatcher.1.0.1\lib\net45\VillageSoftware.PathMatcher.dll</HintPath>
    </Reference>

由于某种原因,该项目不喜欢版本信息。如果您进行初始的后nuget安装并将版本修改为Version=1.0.1(从版本末尾删除.0),您会发现该引用有效。我没有很好的答案为什么会这样,但你可能想要更改AssemblyInfo.cs中的版本控制以匹配nuget包。

要修复的最终结果:

    <Reference Include="VillageSoftware.PathMatcher, Version=1.0.1, Culture=neutral, processorArchitecture=MSIL">
        <HintPath>..\packages\VillageSoftware.PathMatcher.1.0.1\lib\net45\VillageSoftware.PathMatcher.dll</HintPath>
    </Reference>