WPF ClickOnce 遗漏引用
WPF ClickOnce missed references
我有一个与本地 SQLite 和 Entity Framework Core 配合使用的 WPF 应用程序。我想使用 ClickOnce 分发我的应用程序。
当我 运行 使用 Visual Studio 2017 时一切正常。但是当我使用 ClickOnce 时应用程序在启动时崩溃。崩溃太早了,所以我什至无法记录异常。一段时间后,我发现发布文件夹中缺少一些 dll。例如 System.Runtime。所有引用都是 NuGet 包。然后我发现尽管我在我的项目 ClickOnce 应用程序文件列表中引用了 dll,但不包含它。
我目前找到的唯一解决方案是将丢失的 dll 作为文件添加到我的项目的根目录中,并将构建操作设置为 Content。在 ClickOnce 应用程序文件对话框中,我将发布状态设置为 Include。
现在可以用了,但看起来不是最好的方法。问题是为什么他们首先被错过了。更有可能是我遗漏了什么或者我不明白问题的根源。
更新:
您可以找到示例代码 here。
它从 Visual Studio 开始运行,但当您尝试将其安装为 ClickOnce 应用程序时一开始就崩溃。
UPD:问题已在 Visual Studio 专业版 15.6.1
中修复
即使您将 dll 设置为复制本地,除非您在代码中实际使用该 dll,否则该 dll 不会被复制过来。您可以尝试在您的代码中添加 System.Runtime 这样的地方吗?
var dummytest = System.Runtime.GCSettings.IsServerGC;
有两种方法可以解决这个问题。
首先,你必须去 Properties → Publish → Application Files,然后在这个地方,让你的 DLL 文件 include 在你的项目中
但如果它不起作用,请转到参考并制作 DLL 文件 CopyLocal = False。您在项目中添加一个 DLL 文件,例如 Existing Item,并使它们 Copy Always.
它将正常工作。
但是对于你的示例,我看了这个并解决了它。看这张图片:
您有四个 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
然后发布它和运行它就像这张照片一样。我 运行 它来自发布文件并且它有效。
基于 https://blogs.msdn.microsoft.com/bclteam/p/asynctargetingpackkb/ 的第 9 期,我能够执行以下操作:
症状
以 .NET Framework 4.0 为目标且引用 Microsoft.Bcl
或 Microsoft.Bcl.Async
包的 ClickOnce 应用程序在安装后可能会遇到 TypeLoadException
或其他错误。
分辨率
发生这种情况是因为 ClickOnce 无法部署某些必需的程序集。作为解决方法,请执行以下操作:
- 右键单击项目并选择添加现有项
- 浏览到 System.Runtime.dll 所在的文件夹
- 在文件名文本框中粘贴文件的路径
- 单击“添加”按钮旁边的向下箭头并选择添加为Link
- 在解决方案资源管理器中,按住 CTRL select System.Runtime.dll
- 右键单击 selection,选择 Properties 并将 Copy to Output Directory 更改为 总是复制
- 重新发布
我有一个与本地 SQLite 和 Entity Framework Core 配合使用的 WPF 应用程序。我想使用 ClickOnce 分发我的应用程序。
当我 运行 使用 Visual Studio 2017 时一切正常。但是当我使用 ClickOnce 时应用程序在启动时崩溃。崩溃太早了,所以我什至无法记录异常。一段时间后,我发现发布文件夹中缺少一些 dll。例如 System.Runtime。所有引用都是 NuGet 包。然后我发现尽管我在我的项目 ClickOnce 应用程序文件列表中引用了 dll,但不包含它。
我目前找到的唯一解决方案是将丢失的 dll 作为文件添加到我的项目的根目录中,并将构建操作设置为 Content。在 ClickOnce 应用程序文件对话框中,我将发布状态设置为 Include。
现在可以用了,但看起来不是最好的方法。问题是为什么他们首先被错过了。更有可能是我遗漏了什么或者我不明白问题的根源。
更新:
您可以找到示例代码 here。
它从 Visual Studio 开始运行,但当您尝试将其安装为 ClickOnce 应用程序时一开始就崩溃。
UPD:问题已在 Visual Studio 专业版 15.6.1
中修复即使您将 dll 设置为复制本地,除非您在代码中实际使用该 dll,否则该 dll 不会被复制过来。您可以尝试在您的代码中添加 System.Runtime 这样的地方吗?
var dummytest = System.Runtime.GCSettings.IsServerGC;
有两种方法可以解决这个问题。
首先,你必须去 Properties → Publish → Application Files,然后在这个地方,让你的 DLL 文件 include 在你的项目中
但如果它不起作用,请转到参考并制作 DLL 文件 CopyLocal = False。您在项目中添加一个 DLL 文件,例如 Existing Item,并使它们 Copy Always.
它将正常工作。
但是对于你的示例,我看了这个并解决了它。看这张图片:
您有四个 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
然后发布它和运行它就像这张照片一样。我 运行 它来自发布文件并且它有效。
基于 https://blogs.msdn.microsoft.com/bclteam/p/asynctargetingpackkb/ 的第 9 期,我能够执行以下操作:
症状
以 .NET Framework 4.0 为目标且引用 Microsoft.Bcl
或 Microsoft.Bcl.Async
包的 ClickOnce 应用程序在安装后可能会遇到 TypeLoadException
或其他错误。
分辨率
发生这种情况是因为 ClickOnce 无法部署某些必需的程序集。作为解决方法,请执行以下操作:
- 右键单击项目并选择添加现有项
- 浏览到 System.Runtime.dll 所在的文件夹
- 在文件名文本框中粘贴文件的路径
- 单击“添加”按钮旁边的向下箭头并选择添加为Link
- 在解决方案资源管理器中,按住 CTRL select System.Runtime.dll
- 右键单击 selection,选择 Properties 并将 Copy to Output Directory 更改为 总是复制
- 重新发布