c# - 类库中定义的内容在 ClickOnce 部署期间不传输

标签 c# winforms visual-studio-2010 clickonce

我有一个 WinForms、C# 解决方案,它使用 ClickOnce 部署,导致资源文件出现一些问题。简而言之,在我使用 ClickOnce 部署后,类库项目中标记为内容的文件不会复制到输出 bin/文件夹。

这是解决方案的基本结构(它包含的项目比我在下面列出的项目多得多)

Solution 
 |--Gui 1 Project
 |  |--References
 |  |  |--ClassLibrary
 |--Gui 2 Project
 |  |--References
 |  |  |--ClassLibrary
 |--Main Gui Project  (StartUp Project)
 |  |--References
 |  |  |--Gui 1 Project
 |  |  |--Gui 2 Project
 |  |  |--ClassLibrary
 |  |--Datafile.wav    (Build Action: Content, Copy-if-newer)
 |  |--Mods.xml        (Build Action: Content, Copy-if-newer)
 |  |--VariousSourceFiles.cs
 |--ClassLibrary
 |  |--Resources
 |  |  |--Elements.xml     (Build Action: Content, Copy-if-newer)
 |  |  |--AminoAcids.xml   (Build Action: Content, Copy-if-newer)
 |  |--VariousSourceFiles.cs

Main Gui 项目是该程序的启动项目,是一个简单的 MDI 容器,可在其中启动其他 GUI 应用程序。当我在我的开发机器上以调试/ Release模式构建时,一切都按预期工作。编译 GUI 程序,将 Datafile.wav 和 Mods.xml 文件复制到 bin/文件夹,将 Elements.xml 和 AminoAcids.xml 文件复制到 bin/Resources/文件夹。该程序按预期运行,没有任何问题。

这就是问题所在,我使用 VS2010 中的 Click-Once 发布功能在我们的服务器上向我的同事内部发布程序。他们能够很好地安装程序,甚至可以启动它。但是,一旦他们单击使用其中一个资源文件(Elements.xml 或 AminoAcids.xml)的按钮,它就会抛出无法找到该文件的异常。其他两个内容文件(Datafile.wav 和 Mods.xml)不会发生这种情况,换句话说,它们已正确复制到最终目录。

所以我转到 Main Gui Project -> Properties -> Publish -> Application Files.. 我看到 Datafile.wav 和 Mods.xml 包含在此列表中。但是,其他两个内容文件(Elements.xml 和 AminoAcids.xml)不是。我相信这是问题所在,因为当我将程序发布到我们的服务器时,它不知道将资源复制过来。我如何通知 ClickOnce 他们需要包含这些文件? ClassLibrary.dll 显示在此列表中,但没有任何 .xml 文件。

然后我尝试转到 ClassLibrary -> Properties -> Publish 但没有用于 Publish 的选项卡,因为它是一个类库。所以我无法指定我希望将这两个资源文件复制到任何客户端计算机上的最终 bin/Resources 文件中。有没有人知道如何克服这个问题?

我想将资源文件 (.xml) 保留为构建操作:内容而不是嵌入式资源,因为程序的用户可能会更改/更新/扩展文件的内容。

最佳答案

我知道这不太好,但它会完成工作。 Microsoft 有一篇文章向您展示了如何在数据文件发布后将其添加到您的“单击一次”部署中。您可以相当轻松地自动执行这些步骤

文章链接为: http://msdn.microsoft.com/en-us/library/6fehc36e(v=vs.110).aspx

如果链接发生变化,请执行以下步骤: 使用 Mage.exe 包含数据文件

1. 将数据文件与应用程序的其余文件一起添加到应用程序目录。

通常,您的应用程序目录将是一个标有部署的当前版本的目录,例如 v1.0.0.0。

2。 更新您的应用程序 list 以列出数据文件。

法师 -u v1.0.0.0\Application.manifest -FromDirectory v1.0.0.0

执行此任务会在您的应用程序 list 中重新创建文件列表,并自动生成哈希签名。

3。 在您首选的文本或 XML 编辑器中打开应用程序 list ,并找到您最近添加的文件的文件元素。

如果您添加了一个名为 Data.xml 的 XML 文件,该文件将类似于以下代码示例。

<file name="Data.xml" hash="23454C18A2DC1D23E5B391FEE299B1F235067C59" hashalg="SHA1" asmv2:size="39500" /> 

1. 将属性类型添加到此元素,并为其提供数据值。

<file name="Data.xml" writeableType="applicationData" hash="23454C18A2DC1D23E5B391FEE299B1F235067C59" hashalg="SHA1" asmv2:size="39500" /> 

1. 使用您的 key 对或证书重新签署您的应用程序 list ,然后重新签署您的部署 list 。

您必须重新签署您的部署 list ,因为它的应用程序 list 哈希已更改。

mage -s app manifest -cf cert_file -pwd password

mage -u 部署 list -appm 应用 list

mage -s 部署 list -cf certfile -pwd 密码

关于c# - 类库中定义的内容在 ClickOnce 部署期间不传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355768/

相关文章:

c# - 使用 LINQ to SQL 左连接

c# - 如何将同步上下文/任务调度程序替换为 TaskCompletionSource.Task 中的另一个同步上下文/任务调度程序以用于ConfigureAwait(false)?

c# - 从另一个进程更新 TextBox 文本

.net - 如何将 x86 和 x64 DLL 混合到同一个 MSI 包中?

c# - 错误设置断点,但仅在调试时在某些行上设置断点

c# - 在 LINQ 中获取结果函数而不转换为存储表达式

c# - RangeValidator 货币值小数点后不能超过 2 位?

C# PictureBox 在另一个 PictureBox 之上

c# - 如何保护 WinForms 应用程序免受直接 SQL

c# - 检查返回值而不将其分配给变量