gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:38:13 25 4
gpt4 key购买 nike

我创建的通用类库 (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 绑定(bind)到的属性,是控件上的 boolean 依赖属性,localBoolToVisibilityConverter 所在的 namespace 的别名(与模板化控件的别名相同)。

项目结构

Project structure

构建配置

项目的 Release 构建配置启用了“XML 文档文件”和“生成库布局”选项。

Build configuration

生成 NuGet 包

我项目的 NuSpec(位于 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.exe spec 命令和 NuGet CLI 版本 4.3.0.4406 生成的。

为了生成 NuGet 包,我首先删除了 binobj 文件夹,并在 Release (Any CPU) 中构建项目配置,在bin文件夹中生成如下结构,

Bin structure

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

nupkg structure

问题:通过 NuGet 包使用类库

在一个新的通用 Windows 应用程序项目中,我在 Visual 的包管理器控制台中运行 Install-Package 命令,并将 nupkg 的绝对路径作为其参数Studio,它安装了生成的包。

构建项目(没有错误)后,我将以下 XAML 添加到新的空白页,

<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

error

在对象浏览器中查看 RefClassLibrary 后,确实如错误提示所示,BoolToVisibilityConverter 类不存在...

object browser

直接使用类库

我使用 Uninstall-Package RefClassLibrary 命令从项目中删除包。

然后我使用命令 7z x RefClassLibrary.1.0.0.nupkg -oOut 解压缩了 nupkg 文件,将其解压缩到文件夹 Out,并通过 Solution Explorer 添加 Reference 直接引用项目中 Out\lib\uap10.0\ 文件夹中包含的 dll这使得它完美地工作BoolToVisibilityConverter 确实出现在对象浏览器中。

应该如何解决这个问题?

正确的程序集包含在 NuGet 包中,尽管它的某些部分(?)没有“导入”到项目中...

最佳答案

当通过 Install-Package Cmdlet 安装 NuGet 包时,据我了解,这就是 NuGet 的作用,

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

  2. .nupkg 文件和一些其他与包关联的 Assets 被复制并缓存在 %USERPROFILE%\.nuget\packages\{identifier}\{version }\ 文件夹。

  3. 然后将包提取并安装到您所在的 Visual Studio 项目中。

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


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

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

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

  2. 后来我添加了BoolToVisibilityConverter,重新生成库包,重新安装到app工程中。

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

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

所以,解决方案是

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

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

...之后您将重新生成具有相同版本号的库包,并将其安装到应用项目中。

关于xaml - 通过 NuGet 包访问的程序集不包含类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46501682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com