Knowledge

QiShunwang

知识分享

.Net下引用多目标框架项目导致XAML无法识别类型的问题

2021/4/26 17:37:00    来源:

背景

我的项目(以下称为LibA)中有一个多目标框架编译的项目,即项目文件包含如下代码:

<PropertyGroup>
    ...
    <TargetFrameworks>netcoreapp3.1;net461</TargetFrameworks>
    ...
</PropertyGroup>

问题 我的一个.Net Framework的WPF程序(以下称为AppB),引用LibA项目后(注意是项目而非dll文件),在xaml中使用到LibA中的类都会提示无法识别。而编译是可以成功的,程序也可以照常运行,只有xaml会有报错提示,且设计器也会报错无法渲染预览

体现 引用处会出现黄色三角形标记,且引用属性中路径显示为空。如果删除重新添加引用,发现路径指向的是.net core的编译结果,且重启VS后重新变为黄色三角警告且路径为空。

思考

问题很清楚了,是设计器(注意,这里单指XAML的设计器)和项目引用识别了错误的目标框架的dll文件。编译器和VS后台代码都可以正确识别。

参考

在排查的过程中,我看了一些可能的解决方案,但是遗憾的是,并没有解决我的问题。以下是一个类似的问题,不过他的需求是.net standard,而我的是.net framework。注意,这个方式只是不适合.net framework的工程,在.net core 和.net standard项目中应该是起作用的!

Is There a Way to Force a Project Reference to .NET Standard Project to a Specific TargetFramework - Stack Overflow

<ProjectReference Include="..\multitargeted_lib\multitargeted_lib.csproj">
  <SetTargetFramework>TargetFramework=netstandard2.0</SetTargetFramework>
</ProjectReference>

延申 以下三个是一些类似的问题,其中有很多.net项目文件的处理示例,比如条件引用之类的可以参考借鉴。

Specify which target framework you want to use from a dependency · Issue #2280 · dotnet/sdk (github.com)

Removing 4.7.1 target build from library for #160. Thanks Martin! ht… · ExtendedXmlSerializer/home@14c7ee8 (github.com)

Specifying both 'TargetFrameworks' and 'TargetFramework' causes dotnet run to fail badly. · Issue #8676 · dotnet/sdk (github.com)

解决方案

最终我的思考是,为什么单单会指向.net core而不是.net framework?于使我把TargetFrameworks调换了一下位置:

<PropertyGroup>
    ...
    <TargetFrameworks>net461;netcoreapp3.1</TargetFrameworks>
    ...
</PropertyGroup>

结果仍然不行,因为VS没重启!没重启!改完重启一下VS即可。

文章引用:http://www.qishunwang.net/knowledge_show_80562.aspx