我正在制作一个针对.Net Standard 1.3和.Net Fx 4.5的NuGet包。
要做到这一点,我有一个我的NetStandard版本代码的解决方案,经过高度测试,我将两个* .cs文件复制到一个针对Fx 4.5的重复项目 - 我不知道一个更好的方法来做到这一点。这是我第一次定位多个框架。
然后我有一个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软件包”安装我的软件包时窗口,参考出现了感叹号:
双击参考会抛出一个错误消息框:
此项目无法在对象浏览器中查看,因为它不可用或尚未构建。请确保项目可用并已建成。
相反,如果我使用&#39;添加参考&#39;要将VillageSoftware.PathMatcher DLL直接添加到TestBed项目,它可以正常工作。
我的理论是包和主机项目之间的框架不匹配,但我不知道为什么!软件包打包很好,成功的Install-Package显示NuGet使用的是正确的lib,而不是NetStandard版本。我不认为我的lib有任何我在nuspec中遗漏的依赖。
为什么会这样?
答案 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>