WPF ClickOnce错过了引用

时间:2017-05-03 09:38:59

标签: c# .net wpf visual-studio clickonce

我有一个适用于本地SQLite和Entity Framework Core的WPF应用程序。我想使用ClickOnce分发我的应用程序。

当我使用Visual Studio 2017运行时,一切正常。但是当我使用ClickOnce时,应用程序在启动时崩溃了。崩溃是如此早,所以我甚至无法记录异常。过了一段时间后,我发现在发布文件夹中有些dll被遗漏了。例如System.Runtime。所有引用都是NuGet包。然后我发现,尽管我的项目中有一个dll参考,但ClickOnce应用程序文件列表并不包含它。

我现在找到的唯一解决方案是将错过的dll添加为项目根目录中的文件,并将构建操作设置为Content。在ClickOnce应用程序文件对话框中,我将发布状态设置为包含。

它现在有效,但看起来不是最好的方法。问题是为什么他们首先被遗漏。我更有可能错过了一些东西,或者我不明白问题的根源。

UPD:

您可以找到示例代码here

它可以在Visual Studio中运行,但在您尝试将其安装为ClickOnce应用程序时会崩溃。

UPD:问题已在Visual Studio Professional 15.6.1版本中修复

3 个答案:

答案 0 :(得分:2)

有两种解决方法

首先你必须去属性>发布>应用程序文件并在此处使您的dll在项目中包含 this Place

但是如果不起作用,请转到参考并使dll CopyLocal = False ,在项目中添加dll 就像存在的项目,并使它们始终复制

dll and copy allways

它会正常工作

但是对于你的样品我看了这个并且我解决了它 看这个图像:

enter image description here

你有4个dll需要为他们做这个

System.Diagnostics.Tracing.dll
System.Reflection.dll
System.Runtime.dll
System.Runtime.Extensions.dll

首先进入你的参考并使它们复制本地错误

enter image description here

瘦到每个dll的路径并像Exist Item一样添加它们然后使它们全部复制到输出Directoey CopyAlways

enter image description here

然后发布并运行它就像这张图片我从发布文件及其工作中运行它

答案 1 :(得分:0)

即使您将dll设置为本地复制,除非您在代码中实际使用dll,否则不会复制dll。您可以尝试在代码中添加System.Runtime吗?

     var dummytest = System.Runtime.GCSettings.IsServerGC;

答案 2 :(得分:0)

基于https://blogs.msdn.microsoft.com/bclteam/p/asynctargetingpackkb/的问题9,我能够做到以下几点:

症状

引用Microsoft.BclMicrosoft.Bcl.Async软件包的针对.NET Framework 4.0的ClickOnce应用程序在安装后可能会遇到TypeLoadException或其他错误。

分辨率

这是因为ClickOnce无法部署某些必需的程序集。要解决此问题,请执行以下操作:

  1. 右键单击项目,然后选择添加现有项
  2. 浏览到 System.Runtime.dll 所在的文件夹
  3. 文件名文本框中粘贴文件路径
  4. 点击“添加”按钮旁边的向下箭头,然后选择添加为链接
  5. 在解决方案资源管理器中,按住 CTRL 选择 System.Runtime.dll
  6. 右键点击所选内容,选择属性,然后将复制到输出目录更改为始终复制
  7. 重新发布