5

我有一个使用 ClickOnce 部署的 WinForms、C# 解决方案,这会导致资源文件出现一些问题。简而言之,在我使用 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 项目是该程序的 StartUp 项目,是一个简单的 MDI 容器,可在其中启动其他 GUI 应用程序。当我在我的开发机器上以调试/发布模式构建时,一切都按预期工作。编译 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) 保留为 Build Action: Content 而不是 Embedded Resources,因为程序的用户可能会更改/更新/扩展文件的内容。

4

2 回答 2

2

我知道这并不漂亮,但它会完成工作。Microsoft 有一篇文章向您展示如何在发布后将数据文件添加到 Click Once 部署。你可以很容易地自动化这些步骤

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

以下是链接更改时的步骤: 使用 Mage.exe 包含数据文件

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

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

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

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

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

3. 在您喜欢的文本或 XML 编辑器中打开应用程序清单,找到您最近添加的文件的文件元素。

如果您添加了一个名为 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. 使用您的密钥对或证书重新签署您的应用程序清单,然后重新签署您的部署清单。

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

mage -s app manifest -cf cert_file -pwd 密码

mage -u 部署清单 -appm 应用清单

mage -s 部署清单 -cf certfile -pwd 密码

于 2013-02-06T07:27:47.890 回答
0

这似乎更简单。

  1. 在需要数据文件的类库项目目录中,找到该数据文件。
  2. 在类库项目中,转到项目属性选项卡,单击生成事件选项卡并更新生成后事件命令行并添加脚本代码,使用 copy 或 xcopy,将数据文件相对于可执行程序集复制,使用类库文件作为依赖项,如项目引用、项目文件夹所示。
  3. 在可执行程序集的项目中,将复制的文件设置为包含“构建操作”“内容”和“复制到输出目录”“始终复制”的属性。
  4. 在可执行程序集项目属性中,转到发布选项卡,单击“应用程序文件...”按钮。确保选中“显示所有文件”。查找数据文件,确保“发布状态”为“包含”且下载组为“必需”。

ClickOnce 将使用类库部署数据文件,并且类库代码将能够在运行时找到数据文件。

如果我在某个地方错了,请纠正我。

于 2020-10-06T16:20:04.800 回答