我创建的通用类库(UWP)项目有两个类;
1。
public BoolToVisibilityConverter
- IValueConverter
,负责将bool
转换为XAML Visibility
,反之亦然。
2。
一个public CustomControl
模板化控件,其模板(在Themes\Generic.xaml
中定义(下面的项目结构))使用上面提到的BoolToVisibilityConverter
。
它的模板看起来像这样;
<Border ...>
<Border.Resources>
<local:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
</Border.Resources>
<Grid ...>
<Grid ...
Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value, Converter={StaticResource BoolToVisibilityConverter}}" />
</Grid>
</Border>
Value
,Visibility
绑定的属性,是控件上的bool
ean依赖属性,local
是名称空间的别名,{ {1}}驻留(与模板化控件的相同)。
项目的BoolToVisibilityConverter
构建配置具有&#34; XML文档文件&#34;和&#34;生成库布局&#34;选项已启用。
我项目的NuSpec(位于Release
)是;
NuGet\RefClassLibrary.nuspec
该文件是使用<?xml version="1.0"?>
<package >
<metadata>
<id>RefClassLibrary</id>
<version>1.0.0</version>
<!-- various other metadata -->
</metadata>
<files>
<file src="..\bin\Release\**" target="lib\uap10.0"/>
</files>
</package>
命令生成的,NuGet CLI版本为4.3.0.4406。
为了生成NuGet包,我首先删除了nuget.exe spec
和bin
文件夹,并在obj
配置中构建了项目,该配置在Release (Any CPU)
中生成了以下结构}文件夹,
然后,我使用bin
文件夹中的nuget.exe pack RefClassLibrary.nuspec
命令生成了类库的NuGet包,该文件夹生成了具有以下结构的NuGet\
文件,
在新的通用Windows应用程序项目中,我在安装生成的程序包的Visual Studio中的程序包管理器控制台中运行nupkg
命令,并以Install-Package
作为参数的绝对路径。
构建项目后(没有错误),我将以下XAML添加到新的空白页
nupkg
导致错误,
<Page ...
xmlns:rcl="using:RefClassLibrary">
<Grid ...>
<rcl:CustomControl Width="200" Height="200" Value="True"/>
</Grid>
</Page>
在对象浏览器中查看XamlParseException: The text associated with this error code could not be found.
Cannot deserialize XBF metadata type list as 'BoolToVisibilityConverter' was not found in namespace 'RefClassLibrary'. [Line: 0 Position: 0]
StackTrace:
at Windows.UI.Xaml.Controls.Control.ApplyTemplate()
at Microsoft.VisualStudio.DesignTools.UwpDesigner.InstanceBuilders.WindowsUIXamlLocalInstanceManager.EnsureElementInDictionary(Object root, ViewNode knownAncestor)
InnerException: None
后,如果错误显示肯定,RefClassLibrary
类就不存在......
我使用BoolToVisibilityConverter
命令从项目中删除了包。
然后我使用命令Uninstall-Package RefClassLibrary
解压缩nupkg
文件,该命令将其解压缩到文件夹7z x RefClassLibrary.1.0.0.nupkg -oOut
,并直接引用Out
中包含的dll
通过解决方案资源管理器添加引用,使其完美地工作。 Out\lib\uap10.0\
确实显示在对象浏览器中。
正确的程序集包含在NuGet程序包中,虽然它的某些部分(?)没有被导入&#39;进入项目...
答案 0 :(得分:0)
当通过Install-Package
Cmdlet安装NuGet包时,这是,据我所知,NuGet所做的,
检索要安装的软件包的标识符和版本号。它通过指定的参数(在未指定版本号的情况下,默认为最新的'stable'版本)或通过读取它指向的包的内容来实现。
.nupkg
文件和与该软件包关联的其他一些资产将复制到%USERPROFILE%\.nuget\packages\{identifier}\{version}\
文件夹中并缓存。
然后解压缩包并将其安装在您所在的Visual Studio项目中。
当您再次安装相同版本的相同软件包时,NuGet会使用上述文件夹中的缓存文件,而不是重新下载它们。
问题中描述的问题源于我没有递增NuGet包的版本号。
我在我的机器上分两步开发了库项目,
我最初仅使用CustomControl
创建了库项目,生成了库包,并将其安装在外部应用程序项目中。
之后我添加了BoolToVisibilityConverter
,重新生成了库包,并在应用项目中重新安装。
1.0.0
文件中指定的包的版本号(.nuspec
)在第一步和第二步之间没有增加,因此NuGet不使用步骤2中生成的新包。具有相同标识符和版本号的包已在%USERPROFILE%\.nuget\packages\
缓存。
这可以解释为什么它对Sunteen Wu - MSFT起作用(参见对问题的评论)(谢谢!)。
所以,解决方案是,
增加.nuspec
文件中的版本号,或
删除与%USERPROFILE%\.nuget\packages
文件夹中的包(或其版本)对应的文件夹
...之后你将重新生成具有相同版本号的库包,并将其安装在app项目中。