通过NuGet包访问的程序集不包含类

时间:2017-09-30 10:02:49

标签: xaml uwp nuget nuget-package uwp-xaml

我创建的通用类库(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>

ValueVisibility绑定的属性,是控件上的bool ean依赖属性,local是名称空间的别名,{ {1}}驻留(与模板化控件的相同)。

项目结构

Project structure

构建配置

项目的BoolToVisibilityConverter构建配置具有&#34; XML文档文件&#34;和&#34;生成库布局&#34;选项已启用。

Build configuration

生成NuGet包

我项目的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 specbin文件夹,并在obj配置中构建了项目,该配置在Release (Any CPU)中生成了以下结构}文件夹,

Bin structure

然后,我使用bin文件夹中的nuget.exe pack RefClassLibrary.nuspec命令生成了类库的NuGet包,该文件夹生成了具有以下结构的NuGet\文件,

nupkg structure

问题:通过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>

error

在对象浏览器中查看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类就不存在......

object browser

直接使用类库

我使用BoolToVisibilityConverter命令从项目中删除了包。

然后我使用命令Uninstall-Package RefClassLibrary解压缩nupkg文件,该命令将其解压缩到文件夹7z x RefClassLibrary.1.0.0.nupkg -oOut,并直接引用Out中包含的dll通过解决方案资源管理器添加引用,使其完美地工作Out\lib\uap10.0\确实显示在对象浏览器中。

如何修复此问题?

正确的程序集包含在NuGet程序包中,虽然它的某些部分(?)没有被导入&#39;进入项目...

1 个答案:

答案 0 :(得分:0)

当通过Install-Package Cmdlet安装NuGet包时,这是,据我所知,NuGet所做的,

  1. 检索要安装的软件包的标识符和版本号。它通过指定的参数(在未指定版本号的情况下,默认为最新的'stable'版本)或通过读取它指向的包的内容来实现。

  2. .nupkg文件和与该软件包关联的其他一些资产将复制到%USERPROFILE%\.nuget\packages\{identifier}\{version}\文件夹中并缓存。

  3. 然后解压缩包并将其安装在您所在的Visual Studio项目中。

  4. 当您再次安装相同版本的相同软件包时,NuGet会使用上述文件夹中的缓存文件,而不是重新下载它们。

    问题中描述的问题源于我没有递增NuGet包的版本号。

    我在我的机器上分两步开发了库项目,

    1. 我最初仅使用CustomControl创建了库项目,生成了库包,并将其安装在外部应用程序项目中。

    2. 之后我添加了BoolToVisibilityConverter,重新生成了库包,并在应用项目中重新安装。

    3. 1.0.0文件中指定的包的版本号(.nuspec)在第一步和第二步之间没有增加,因此NuGet不使用步骤2中生成的新包。具有相同标识符和版本号的包已在%USERPROFILE%\.nuget\packages\缓存。

      这可以解释为什么它对Sunteen Wu - MSFT起作用(参见对问题的评论)(谢谢!)。

      所以,解决方案是

      1. 增加.nuspec文件中的版本号,或

      2. 删除与%USERPROFILE%\.nuget\packages文件夹中的包(或其版本)对应的文件夹

      3. ...之后你将重新生成具有相同版本号的库包,并将其安装在app项目中。