WPF 中引用的 .NET Standard class 库 - 设计时 XAML 中的符号错误
.NET Standard class library referenced in WPF - sign error in XAML at design time
我制作了一个网络标准 class 库。我的目标是 netstandard 1.6。我的 csproj 是这样的:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Label="Globals">
<SccProjectName>SAK</SccProjectName>
<SccProvider>SAK</SccProvider>
<SccAuxPath>SAK</SccAuxPath>
<SccLocalPath>SAK</SccLocalPath>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>netstandard1.6</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Runtime" Version="4.3.0" />
<PackageReference Include="System.Runtime.Serialization.Primitives" Version="4.3.0" />
<PackageReference Include="System.Runtime.Serialization.Xml" Version="4.3.0" />
</ItemGroup>
</Project>
我有一个 WPF 项目,我在其中引用了这个 dll。我可以在 c# 中使用 netstandard dll 的 classes。我也可以在 xaml 中使用它们。我什至得到他们的情报。 但是xaml设计师说,我的xaml无效。我可以编译解决方案,我可以运行应用程序。在运行时间一切正常。但是设计师无法使用它。
这个人 class 看起来像:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Text;
namespace DS.Publications.Common
{
[DataContract(Namespace = Constants.NamespaceConstants.DataContractNamespace)]
public class Person : INotifyPropertyChanged
{
private string _Title = string.Empty;
[DataMember]
public string Title { get { return _Title; } set { Set(ref _Title, value); } }
private string _ForeName;
[DataMember]
public string ForeName { get { return _ForeName; } set { Set(ref _ForeName, value); } }
private string _LastName;
[DataMember]
public string LastName { get { return _LastName; } set { Set(ref _LastName, value); } }
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (field == null || !field.Equals(value))
{
field = value;
this.OnPropertyChanged(propertyName);
return true;
}
return false;
}
}
}
你知道解决方法吗,或者你有什么想法,我该如何纠正?
我也遇到了类似的问题;我在 .NET 标准项目中有一个 class,并尝试使用 Observable 集合将其显示在 ListBox 中。事实证明,XAML 不喜欢 DataContracts。一旦我从我的 .NET Standard class 中删除了 [DataContract]
属性,它就起作用了。我已经就此行为向 Microsoft 提交了 bug report。如果我的假设是正确的,那么只要删除 [DataContract]
属性,错误就会消失。
至于解决方案。您可以删除 DataContract(它不会像您需要的那样工作,否则您不会使用它,我猜......)或者为每个 class 创建一个代理对象,它反映了功能并重定向了函数调用到原始对象的基础副本。我没有尝试这是否足以阻止 XAML 触发数据合同(如果发生这种情况)。
它可能在编译模式下工作,因为它仅被定义为资源。只要它不主动显示,它就可能起作用。可能是设计师试图展示资源?
这可能与另一个错误 (here and ) 有关,其中 .NET Standard 的依赖项不 importet/translated 到其他项目。此错误报告描述了当从引用的 DLL 访问功能时发生崩溃。基本上你有一个使用第 3 方库 X 的 .NET 标准库和一个使用你的 .NET 标准库 Y 的 .NET Framework 项目 Z。一旦你在 Y 中调用一个方法,而这个方法又调用 X,你就完蛋了。您需要手动将 Y 中的所有引用导入您的项目 Z。
至于这可能是如何相关的。数据协定是 .NET Standard 独有的功能,旨在取代 Serializable
。但是它们似乎有更多的功能,这些功能是由 XAML 前端以某种方式触发的。由于数据协定不适用于 .NET Framework,一切都崩溃了。
如果您设法找到解决方案,请告诉我们,因为此错误需要 'proper' 解决方法...
我还没有真正找到解决这个问题的方法...我已经将我的 netstandard 库的目标框架设置回 netstandard1.3。以 1.3 为目标时,一切正常。我希望,下一个 VS-Update 会带来修复。
PS。当我将目标设置为 netstandard1.3 时,我遇到了问题,即找到了旧的 netstandard1.6 二进制文件,直到我真正清理了如下所示的解决方案:
How to really clean the solution.
我制作了一个网络标准 class 库。我的目标是 netstandard 1.6。我的 csproj 是这样的:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Label="Globals">
<SccProjectName>SAK</SccProjectName>
<SccProvider>SAK</SccProvider>
<SccAuxPath>SAK</SccAuxPath>
<SccLocalPath>SAK</SccLocalPath>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>netstandard1.6</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Runtime" Version="4.3.0" />
<PackageReference Include="System.Runtime.Serialization.Primitives" Version="4.3.0" />
<PackageReference Include="System.Runtime.Serialization.Xml" Version="4.3.0" />
</ItemGroup>
</Project>
我有一个 WPF 项目,我在其中引用了这个 dll。我可以在 c# 中使用 netstandard dll 的 classes。我也可以在 xaml 中使用它们。我什至得到他们的情报。 但是xaml设计师说,我的xaml无效。我可以编译解决方案,我可以运行应用程序。在运行时间一切正常。但是设计师无法使用它。
这个人 class 看起来像:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Text;
namespace DS.Publications.Common
{
[DataContract(Namespace = Constants.NamespaceConstants.DataContractNamespace)]
public class Person : INotifyPropertyChanged
{
private string _Title = string.Empty;
[DataMember]
public string Title { get { return _Title; } set { Set(ref _Title, value); } }
private string _ForeName;
[DataMember]
public string ForeName { get { return _ForeName; } set { Set(ref _ForeName, value); } }
private string _LastName;
[DataMember]
public string LastName { get { return _LastName; } set { Set(ref _LastName, value); } }
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (field == null || !field.Equals(value))
{
field = value;
this.OnPropertyChanged(propertyName);
return true;
}
return false;
}
}
}
你知道解决方法吗,或者你有什么想法,我该如何纠正?
我也遇到了类似的问题;我在 .NET 标准项目中有一个 class,并尝试使用 Observable 集合将其显示在 ListBox 中。事实证明,XAML 不喜欢 DataContracts。一旦我从我的 .NET Standard class 中删除了 [DataContract]
属性,它就起作用了。我已经就此行为向 Microsoft 提交了 bug report。如果我的假设是正确的,那么只要删除 [DataContract]
属性,错误就会消失。
至于解决方案。您可以删除 DataContract(它不会像您需要的那样工作,否则您不会使用它,我猜......)或者为每个 class 创建一个代理对象,它反映了功能并重定向了函数调用到原始对象的基础副本。我没有尝试这是否足以阻止 XAML 触发数据合同(如果发生这种情况)。
它可能在编译模式下工作,因为它仅被定义为资源。只要它不主动显示,它就可能起作用。可能是设计师试图展示资源?
这可能与另一个错误 (here and
至于这可能是如何相关的。数据协定是 .NET Standard 独有的功能,旨在取代 Serializable
。但是它们似乎有更多的功能,这些功能是由 XAML 前端以某种方式触发的。由于数据协定不适用于 .NET Framework,一切都崩溃了。
如果您设法找到解决方案,请告诉我们,因为此错误需要 'proper' 解决方法...
我还没有真正找到解决这个问题的方法...我已经将我的 netstandard 库的目标框架设置回 netstandard1.3。以 1.3 为目标时,一切正常。我希望,下一个 VS-Update 会带来修复。
PS。当我将目标设置为 netstandard1.3 时,我遇到了问题,即找到了旧的 netstandard1.6 二进制文件,直到我真正清理了如下所示的解决方案: How to really clean the solution.