【问题标题】:WPF ClickOnce missed referencesWPF ClickOnce 错过了引用
【发布时间】:2017-05-03 09:38:58
【问题描述】:

我有一个可与本地 SQLite 和 Entity Framework Core 配合使用的 WPF 应用程序。我想使用 ClickOnce 分发我的应用程序。

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

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

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

更新:

您可以找到示例代码here

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

UPD:该问题已在 Visual Studio Professional 15.6.1 版中得到修复

【问题讨论】:

  • @Pikoh 正如我所说:“尽管我在我的项目 ClickOnce 应用程序文件列表中引用了 dll,但它不包含它”
  • @Pikoh 在将它们作为通用文件添加到项目之前,我根本没有它在列表中。
  • 你有没有在参考“本地副本”设置为真?
  • @Pikoh 是的,我愿意。
  • 我刚刚尝试使用一个测试应用程序来添加 Entity Framework Core 包,它会自动显示在“应用程序文件”中,所以我无法为您提供更多帮助。对不起

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


【解决方案1】:

有两种方法可以解决这个问题

首先,你必须去PropertiesPublishApplication Files,在这个地方,制作你的DLL文件包含在您的项目中

但如果它不起作用,请转到参考并制作 DLL 文件 CopyLocal = False。您在项目中添加一个类似 Existing Item 的 DLL 文件并使其始终复制

它将正常工作。

但是对于您的示例,我看了这个并解决了它。看这张图:

您有四个 DLL 文件。您需要为他们这样做:

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

首先转到您的参考资料并使其Copy Local False

然后去每个DLL文件的路径,像Existing Item一样添加,然后全部Copy To Output Directory CopyAlways

然后发布它并像这张图片一样运行它。我从发布文件运行它,它可以工作。

【讨论】:

  • 正如我在问题中提到的,我在属性 > 发布 > 应用程序中没有库。第二种解决方案有效,但在问题中有所描述。
  • 你能给我团队查看器吗?我远程你的系统并查看你系统上的代码和系统?
  • 感谢您的关注和时间!在问题中添加了指向githab 的链接,您可以查看示例吗?或者它适用于您的环境?
  • 我更新了我的答案并对其进行了测试;)
  • 更重要的是 - 为什么会发生这种情况,您能否解决此问题,以便您可以使用 copylocal=true。这是一个有效的愚蠢解决方案。
【解决方案2】:

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

     var dummytest = System.Runtime.GCSettings.IsServerGC;

【讨论】:

  • 我的代码没有对库的直接引用,但应该添加它,因为它被我的代码中使用的其他库使用。
【解决方案3】:

根据https://blogs.msdn.microsoft.com/bclteam/p/asynctargetingpackkb/ 上的第 9 期,我能够做到以下几点:

症状

以 .NET Framework 4.0 为目标且引用 Microsoft.BclMicrosoft.Bcl.Async 包的 ClickOnce 应用程序在安装后可能会遇到 TypeLoadException 或其他错误。

分辨率

发生这种情况是因为 ClickOnce 无法部署某些必需的程序集。作为一种解决方法,请执行以下操作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多