C# UWP应用程序在从应用商店下载时崩溃,但在侧面加载时不会崩溃

C# UWP应用程序在从应用商店下载时崩溃,但在侧面加载时不会崩溃,c#,uwp,.net-native,C#,Uwp,.net Native,如果我通过VisualStudio部署我的应用程序(UWP、C#/xaml),或者如果我在手机上侧面加载appx,那么我的应用程序(UWP、C#/xaml)在发布模式下运行良好 但如果我从商店下载并运行它,它就会崩溃,出现以下异常 System.IO.FileLoadException:无法加载文件或程序集“System.Threading,Version=4.0.10.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。定位的程序

如果我通过VisualStudio部署我的应用程序(UWP、C#/xaml),或者如果我在手机上侧面加载appx,那么我的应用程序(UWP、C#/xaml)在发布模式下运行良好

但如果我从商店下载并运行它,它就会崩溃,出现以下异常

System.IO.FileLoadException:无法加载文件或程序集“System.Threading,Version=4.0.10.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。定位的程序集清单定义与程序集引用不匹配。(来自HRESULT的异常:0x8013100)

此外,同一个应用程序在PC上运行时,不会在通过VS进行侧加载/加载时崩溃,甚至从应用商店下载时也不会崩溃。 任何帮助都将不胜感激

编辑:代码段 > 私有静态字典lockDictionary=新字典()

私有静态信号量lim getLockElement(字符串文件名)
{
if(lockDictionary.ContainsKey(文件名))
返回锁字典[文件名];
其他的
{
SemaphoreSlim objectToReturn=新的SemaphoreSlim(1);
添加(文件名,objectToReturn);
返回对象返回;
}
}
专用异步静态任务getFile(字符串键)
{
尝试
{
返回wait-storageFolder.GetFileAsync(键);
}
捕获(FileNotFoundException ex)
{
返回null;
}
}
公共静态异步任务readFileDataIndependentOfUserId(字符串键)
{
AccountFunctions.logMsg(“等待”+键);
等待getLockElement(key.WaitAsync();
logMsg(“进入”+键);
尝试
{
StorageFile文件=等待获取文件(密钥);
if(File==null)
返回null;
string text=await FileIO.ReadTextAsync(文件);
返回文本;
}
最后
{
AccountFunctions.logMsg(“已发布”+键);
getLockElement(key.Release();
}
}
公共静态异步任务saveDataInFileIndependentOfUserId(字符串键,字符串数据)
{
AccountFunctions.logMsg(“等待”+键);
等待getLockElement(key.WaitAsync();
logMsg(“进入”+键);
尝试
{
var FileName=key;
var Fileoption=CreationCollisionOption.ReplaceExisting;
var File=await-storageFolder.CreateFileAsync(文件名,Fileoption);
等待FileIO.WriteTextAsync(文件、数据);
logMsg(“保存:“+key+”:“+data”);
}
最后
{
AccountFunctions.logMsg(“已发布”+键);
getLockElement(key.Release();
}
}
公共静态异步任务removeFileDataIndependentOfUserId(字符串键)
{
AccountFunctions.logMsg(“等待”+键);
等待getLockElement(key.WaitAsync();
logMsg(“进入”+键);
尝试
{
StorageFile文件=等待获取文件(密钥);
if(File==null)
{
getLockElement(key.Release();
返回;
}
wait File.deleteSync();
}
最后
{
AccountFunctions.logMsg(“已发布”+键);
getLockElement(key.Release();
}
}

崩溃发生在包含这些静态函数的类的构造函数中。AccountFunctions.logMsg是一个函数,如果附加,它只会写入调试器。

似乎您的本地版本中可能没有启用.NET Native。如果查看project properties>Build,您将看到启用.NET本机工具链的复选框。确保选中该框进行发布,因为这是您在应用商店中构建的配置


UWP模板为发布配置添加了以下属性:true。如果您已经将一个旧项目迁移到UWP,那么将您的项目文件与空白UWP模板进行区分可能会有用,看看是否有其他可能会给您带来麻烦的奇怪之处。

它是否在同一台机器上崩溃,它也能正常工作?好吧,这是不应该发生的。使用.NET本机在应用商店服务器上重建应用程序。这将删除对.NET程序集的任何依赖关系。NET Native的一个问题是反射代码非常麻烦,构建工具无法看到您可能具有间接依赖关系。这就是为什么在您自己的机器上有.NET本机,这样您就可以测试这样的代码。听起来你好像跳过了那个测试。@HansPassant你能给我指一下写的方向吗?你在说什么考试?另外,我的代码中并没有真正使用反射。@Johniekar它在同一部手机上崩溃,如果我侧载应用程序,它会在同一部手机上工作。看起来您的本地版本中可能没有启用.NET Native。如果查看project properties>Build,您将看到启用.NET本机工具链的复选框。确保选中该框,因为这是在应用商店中生成的配置。如果您仍然有问题,这里有一些信息/提示:
    private static SemaphoreSlim getLockElement(string fileName)
    {
        if (lockDictionary.ContainsKey(fileName))
            return lockDictionary[fileName];
        else
        {
            SemaphoreSlim objectToReturn = new SemaphoreSlim(1);
            lockDictionary.Add(fileName, objectToReturn);
            return objectToReturn;
        }
    }

    private async static Task<StorageFile> getFile(string key)
    {
        try
        {
            return await storageFolder.GetFileAsync(key);
        }
        catch (FileNotFoundException ex)
        {
            return null;
        }
    }

    public static async Task<string> readFileDataIndependentOfUserId(string key)
    {
        AccountFunctions.logMsg("Awaiting " + key);
        await getLockElement(key).WaitAsync();
        AccountFunctions.logMsg("Got into " + key);

        try
        {
            StorageFile File = await getFile(key);
            if (File == null)
                return null;
            string text = await FileIO.ReadTextAsync(File);

            return text;
        }
        finally
        {
            AccountFunctions.logMsg("Released " + key);
            getLockElement(key).Release();
        }
    }

    public static async Task saveDataInFileIndependentOfUserId(string key, string data)
    {
        AccountFunctions.logMsg("Awaiting " + key);
        await getLockElement(key).WaitAsync();
        AccountFunctions.logMsg("Got into " + key);

        try
        {
            var FileName = key;
            var Fileoption = CreationCollisionOption.ReplaceExisting;
            var File = await storageFolder.CreateFileAsync(FileName, Fileoption);
            await FileIO.WriteTextAsync(File, data);
            AccountFunctions.logMsg("Saving : " + key + " : " + data);
        }
        finally
        {
            AccountFunctions.logMsg("Released " + key);
            getLockElement(key).Release();
        }
    }

    public static async Task removeFileDataIndependentOfUserId(string key)
    {
        AccountFunctions.logMsg("Awaiting " + key);
        await getLockElement(key).WaitAsync();
        AccountFunctions.logMsg("Got into " + key);

        try
        {
            StorageFile File = await getFile(key);
            if (File == null)
            {
                getLockElement(key).Release();
                return;
            }
            await File.DeleteAsync();
        }
        finally
        {
            AccountFunctions.logMsg("Released " + key);
            getLockElement(key).Release();
        }
    }