使用 .Net 本机构建 UWP 应用程序时出现 MissingMetadataException
MissingMetadataException when building UWP app with .Net native
我有这个 UWP 应用程序,它使用一个项目(UWP class 库),它本身使用 EF7 和 SQLite。
我尝试使用 .Net 本机工具链在 Release 模式下构建应用程序,构建成功完成(经过很长一段时间,并且消耗了尽可能多的内存),但应用程序立即崩溃离开启动画面。
在听取了关于 SO 的一些建议后,我尝试了带有调试模式的 .Net 本机,构建完成就像在发布模式下一样,但是我在输出中收到很多错误 window,这是相同的场景作为这个
我听从了@Matt Whilden 的建议,排除了那些错误,然后再次尝试。
这次被这个大名鼎鼎的MissingMetadataException
击中了:
输出 window 显示:
Exception thrown: 'System.AggregateException' in System.Private.Threading.dll
Exception thrown: 'System.ArgumentException' in System.Linq.Expressions.dll
Exception thrown: 'System.ArgumentException' in System.Linq.Expressions.dll
Exception thrown: 'System.ArgumentException' in System.Linq.Expressions.dll
The thread 0x2a30 has exited with code 0 (0x0).
Exception thrown: 'System.Reflection.MissingMetadataException' in System.Private.Reflection.Core.dll
Additional information: 'Microsoft.Extensions.Caching.Memory.MemoryCacheOptions' is missing
metadata. For more information, please visit
http://go.microsoft.com/fwlink/?LinkID=392859
我试图在执行过程中遵循我的代码,但我发现这是由我的 DbContext
第一次调用 DbSet
table 引起的
public long GetLastTimeStamp()
{
//-----> Here is the line causing the error
var sortedArticles = DbContext.Articles.OrderByDescending(article => article.ArticlePubDate).ToList();
if (sortedArticles != null && sortedArticles.Count != 0)
{
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local);
TimeSpan elapsedTime = sortedArticles.First().ArticlePubDate - epoch;
return (long)elapsedTime.TotalSeconds;
}
else
{
return 0;
}
}
上面这个方法是在Async方法内部调用的,才知道。
我拼命地尝试通过以下方式调用 .ToList() :
var sortedArticles = DbContext.Articles.ToList().OrderByDescending(article => article.ArticlePubDate).ToList();
但还是报同样的错误
这真的很令人沮丧,我不知道如何解决这个问题,不确定我应该更改什么以及如何更改 Default.rd.xml
,任何人都可以帮助告诉我如何正确实现此构建?
请尝试在 Default.rd.xml 中添加类型 'Microsoft.Extensions.Caching.Memory.MemoryCacheOptions'(已存在于您的项目中)。
例如:
<?xml version="1.0" encoding="utf-8"?>
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Type Name="Microsoft.Extensions.Caching.Memory.MemoryCacheOptions" Dynamic="Required All" />
</Application>
</Directives>
我有这个 UWP 应用程序,它使用一个项目(UWP class 库),它本身使用 EF7 和 SQLite。
我尝试使用 .Net 本机工具链在 Release 模式下构建应用程序,构建成功完成(经过很长一段时间,并且消耗了尽可能多的内存),但应用程序立即崩溃离开启动画面。
在听取了关于 SO 的一些建议后,我尝试了带有调试模式的 .Net 本机,构建完成就像在发布模式下一样,但是我在输出中收到很多错误 window,这是相同的场景作为这个
我听从了@Matt Whilden 的建议,排除了那些错误,然后再次尝试。
这次被这个大名鼎鼎的MissingMetadataException
击中了:
输出 window 显示:
Exception thrown: 'System.AggregateException' in System.Private.Threading.dll Exception thrown: 'System.ArgumentException' in System.Linq.Expressions.dll Exception thrown: 'System.ArgumentException' in System.Linq.Expressions.dll Exception thrown: 'System.ArgumentException' in System.Linq.Expressions.dll The thread 0x2a30 has exited with code 0 (0x0). Exception thrown: 'System.Reflection.MissingMetadataException' in System.Private.Reflection.Core.dll Additional information: 'Microsoft.Extensions.Caching.Memory.MemoryCacheOptions' is missing
metadata. For more information, please visit http://go.microsoft.com/fwlink/?LinkID=392859
我试图在执行过程中遵循我的代码,但我发现这是由我的 DbContext
第一次调用DbSet
table 引起的
public long GetLastTimeStamp()
{
//-----> Here is the line causing the error
var sortedArticles = DbContext.Articles.OrderByDescending(article => article.ArticlePubDate).ToList();
if (sortedArticles != null && sortedArticles.Count != 0)
{
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local);
TimeSpan elapsedTime = sortedArticles.First().ArticlePubDate - epoch;
return (long)elapsedTime.TotalSeconds;
}
else
{
return 0;
}
}
上面这个方法是在Async方法内部调用的,才知道。
我拼命地尝试通过以下方式调用 .ToList() :
var sortedArticles = DbContext.Articles.ToList().OrderByDescending(article => article.ArticlePubDate).ToList();
但还是报同样的错误
这真的很令人沮丧,我不知道如何解决这个问题,不确定我应该更改什么以及如何更改 Default.rd.xml
,任何人都可以帮助告诉我如何正确实现此构建?
请尝试在 Default.rd.xml 中添加类型 'Microsoft.Extensions.Caching.Memory.MemoryCacheOptions'(已存在于您的项目中)。
例如:
<?xml version="1.0" encoding="utf-8"?>
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Type Name="Microsoft.Extensions.Caching.Memory.MemoryCacheOptions" Dynamic="Required All" />
</Application>
</Directives>