【发布时间】:2020-04-11 08:42:14
【问题描述】:
我正在尝试编译一个 uwp 应用程序,但我收到以下错误:
警告 MCG:警告 MCG0007:方法“System.Int32 Microsoft.DotNet.PlatformAbstractions.Native.NativeMethods.Windows.RtlGetVersion(Microsoft.DotNet.PlatformAbstractions.Native.NativeMethods.Windows) 的未解析 P/Invoke 方法“ntdll!RtlGetVersion” .RTL_OSVERSIONINFOEX)'。调用此方法会在运行时抛出异常。请确保 P/Invoke 指向 UWP 应用程序中允许的 Windows API,或作为包一部分的本机 DLL。如果由于某种原因您的 P/Invoke 不满足这些要求,请使用 [DllImport(ExactSpelling=true) 表明您了解使用非 UWP API 的含义。
问题是我找不到来源,有没有办法调试这个问题?或者我怎样才能找到导致问题的库?
更新:我附上了一个引发相同编译错误的示例项目。如果有人可以看看。我将不胜感激。
更新 2:我有一个使用以下 nuget 包的 UWP 应用:
此应用使用 3 个 .net 标准库。
UWP 应用包含以下引用。
<PackageReference Include="AdaptiveCards">
<Version>1.2.4</Version>
</PackageReference>
<PackageReference Include="MailKit">
<Version>2.4.1</Version>
</PackageReference>
<PackageReference Include="Microsoft.AppCenter">
<Version>2.6.4</Version>
</PackageReference>
<PackageReference Include="Microsoft.AppCenter.Analytics">
<Version>2.6.4</Version>
</PackageReference>
<PackageReference Include="Microsoft.AppCenter.Crashes">
<Version>2.6.4</Version>
</PackageReference>
<PackageReference Include="Microsoft.Azure.Storage.Blob">
<Version>11.1.1</Version>
</PackageReference>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.9</Version>
</PackageReference>
<PackageReference Include="Microsoft.Services.Store.Engagement">
<Version>10.1901.28001</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp">
<Version>6.0.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications">
<Version>6.0.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.UI.Animations">
<Version>6.0.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.UI.Controls">
<Version>6.0.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.UI.Controls.DataGrid">
<Version>6.0.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.UI.Xaml">
<Version>2.3.191211002</Version>
</PackageReference>
<PackageReference Include="Microsoft.Xaml.Behaviors.Uwp.Managed">
<Version>2.0.1</Version>
</PackageReference>
<PackageReference Include="MimeKit">
<Version>2.4.1</Version>
</PackageReference>
<PackageReference Include="MvvmLight">
<Version>5.4.1.1</Version>
</PackageReference>
<PackageReference Include="SQLitePCLRaw.bundle_green">
<Version>2.0.2</Version>
</PackageReference>
<PackageReference Include="SQLitePCLRaw.core">
<Version>2.0.2</Version>
</PackageReference>
<PackageReference Include="Win2D.uwp">
<Version>1.24.0</Version>
</PackageReference>
它使用 3 个 .netStandard 库。
服务库
<PackageReference Include="itext7" Version="7.1.9" />
<PackageReference Include="Microsoft.AppCenter" Version="2.6.4" />
<PackageReference Include="Microsoft.AppCenter.Analytics" Version="2.6.4" />
<PackageReference Include="Microsoft.Azure.Storage.Blob" Version="11.1.1" />
<PackageReference Include="Microsoft.Identity.Client" Version="4.7.1" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Portable.BouncyCastle" Version="1.8.5.2" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="4.7.0" />
<PackageReference Include="System.IO.FileSystem" Version="4.3.0" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="4.7.0" />
<PackageReference Include="System.ServiceModel.Http" Version="4.7.0" />
数据库
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
<PackageReference Include="Z.EntityFramework.Extensions.EFCore" Version="3.0.31" />
<PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="3.0.31" />
<PackageReference Include="Z.Expressions.Eval" Version="3.0.11" />
签名库
<PackageReference Include="BouncyCastle.NetCore" Version="1.8.5" />
<PackageReference Include="System.Security.AccessControl" Version="4.7.0" />
<PackageReference Include="System.Security.Cryptography.Pkcs" Version="4.7.0" />
<PackageReference Include="System.Security.Cryptography.Xml" Version="4.7.0" />
<PackageReference Include="System.Security.Permissions" Version="4.7.0" />
<PackageReference Include="System.Security.Principal.Windows" Version="4.7.0" />
UWP 引用 ServicesLibrary 和 DataLibrary,ServicesLibrary 引用 SigningLibrary 和 DataLibrary。这就是我试图在发布模式下编译的应用程序的剖析。
非常感谢您的帮助。
【问题讨论】:
-
请分享你的代码
-
嗨@Michael,如果它不包含敏感数据,请分享您的代码。我们不能仅根据错误信息定位问题的原因。您是否引入了一个不适用于 UWP 的库? (比如依赖中只支持
.NET Framework,不支持.NET Standard),或者使用了一些UWP不支持的特殊功能(UWP有严格的权限管理) -
您可以使用
ILDASM(SDK 的一部分)转储您的三个库中的每一个,寻找RtlGetVersion。 -
@Michael 请edit 将您的minimal reproducible example 包含在 Stack Overflow 上,而不是作为外部链接。
-
@Michael
.Net Standard是一种规范,它提供了一种通用的代码构建方式,可以作为跨平台代码共享的基础。但UWP有自己的特点。例如,您可以通过.Net Standard中的路径访问该文件,但在 UWP 中不能这样做。 (可以在.Net Standard中获取File对象,但在UWP中推荐StorageFile。),类似的情况还有很多。所以建议在UWP项目中使用Class Library (Universal Windows)。
标签: c# uwp .net-native