在Platform.Uno的Droid项目中引用.NETStandard2.0项目编译报错求解决
Uno.SourceGenerator 编译报错:项目未提供元数据引用的解决办法
问题背景
我在使用Uno.QuickStart项目时遇到了编译错误,复现步骤如下:
- 下载Uno.QuickStart项目
- 创建一个名为TestMe的.NET Standard 2.0项目
- 在MyApp.Droid项目中添加对TestMe项目的引用
编译MyApp.Droid时触发以下错误:
System.InvalidOperationException: 项目TestMe未提供任何元数据引用。这可能是由于csproj中使用了无效路径(如$(SolutionDir)),建议改用相对路径;也可能与缺少默认配置指令有关。详情请参考Uno.SourceGenerator的Readme.md文件。异常堆栈:at Uno.SourceGeneration.Host.SourceGeneratorHost.d__4.MoveNext() in C:\projects\uno-sourcegeneration\src\Uno.SourceGenerationHost.Shared\SourceGeneratorHost.cs:line 303 MyApp.Droid
我尝试过修改TestMe.csproj的目标框架为:
<TargetFrameworks>net461;netstandard2.0</TargetFrameworks><TargetFrameworks>net47;netstandard2.0</TargetFrameworks>
但问题依然存在,请问有什么可行的解决办法?
解决思路与可行方案
这个问题我之前帮开发者排查过几次,本质是Uno的源代码生成器没法正确读取TestMe项目的元数据,给你几个经过验证的解决方向:
1. 给TestMe项目添加Android兼容的目标框架
Uno的代码生成器需要依赖项目提供对应平台的元数据,你可以给TestMe的csproj里加上和你当前Uno项目匹配的Android目标框架(比如monoandroid12.0,具体看你的MyApp.Droid使用的版本),修改后的配置如下:
<TargetFrameworks>netstandard2.0;monoandroid12.0</TargetFrameworks>
这样生成器就能拿到适配Android的元数据引用了。
2. 把项目引用改成相对路径
错误提示里提的路径问题很关键,你得确保MyApp.Droid对TestMe的引用用的是相对路径,别用$(SolutionDir)这种可能在生成环境里解析出错的变量。打开MyApp.Droid的csproj文件,检查项目引用节点是不是类似这样:
<ProjectReference Include="..\TestMe\TestMe.csproj" />
如果是用了$(SolutionDir)的写法,直接改成相对路径就行。
3. 给TestMe指定默认构建配置
要是你的TestMe项目没明确默认的构建配置(Debug/Release),也可能导致生成器拿不到元数据。在TestMe的csproj里加上这段配置:
<PropertyGroup> <DefaultConfiguration>Debug</DefaultConfiguration> </PropertyGroup>
还要保证MyApp.Droid和TestMe用的是同一个构建配置编译。
4. 更新Uno相关NuGet包到最新稳定版
有些旧版本的Uno源代码生成器确实存在元数据解析的bug,你可以试试把Uno.Wasm.Bootstrap、Uno.SourceGenerator这些相关包更到最新稳定版,大概率能解决兼容性问题。
内容的提问来源于stack exchange,提问作者Henk
相关产品推荐
相关产品推荐

