Xml 调试时正确使用Application.GetContentStream并单击“一次发布”

Xml 调试时正确使用Application.GetContentStream并单击“一次发布”,xml,wpf,clickonce,Xml,Wpf,Clickonce,根据我前面的问题,我有以下设置: PrinterMap.xml的“内容”文件,包含: 构建操作:内容 复制到输出目录:始终复制 开发期间此文件的物理位置为:C:\Nova6\PrintingAndReports\Settings\PrinterMap.xml 假设我有PrinterMap.xml的正确Uri,那么Application.GetContentStream(Uri)允许在编译过程将PrinterMap.xml放在C:\Nova6\pathing\u Desk\bin\Deb

根据我前面的问题,我有以下设置:

  • PrinterMap.xml的“内容”文件,包含:
    • 构建操作:内容
    • 复制到输出目录:始终复制
  • 开发期间此文件的物理位置为:
    C:\Nova6\PrintingAndReports\Settings\PrinterMap.xml
假设我有PrinterMap.xml的正确Uri,那么
Application.GetContentStream(Uri)
允许在编译过程将PrinterMap.xml放在
C:\Nova6\pathing\u Desk\bin\Debug\Settings
目录下进行调试,并允许在
C:\Users\Me\AppData\Local\Apps\2.0\3RPPH36W.WAY\MN0L8QBO.1R4\nurs..tion\u f6d771115904d935\u 0001.0000\u f6a09aea8a2c02e5\Settings\ReportMap.xml

也就是说,我可以在调试此应用程序时使用
Application.GetContentStream(Uri)
,还是有更好的方法或首选程序设计?
这里有最佳实践吗?(正确的Uri是什么?)


感谢您的指导。

您可以使用
GetContentStream
仅指定文件名,这样目录将自动设置为执行程序集位置(即当前文件夹)

或者,如果不想将文件公开给文件系统并将其嵌入程序集中(如果程序集不依赖于外部文件,通常会更好),请改用,例如:

using var stream =
  Assembly
    .GetExecutingAssembly()
    .GetManifestResourceStream("Resources.PrinterMap.xml");
您还可以使用项目属性添加资源。
右键单击“当前项目”并转到“属性”,然后导航到“资源”选项卡,单击“添加资源”旁边的箭头,然后选择“添加现有文件…”:

在这种情况下,您可以直接访问文件,如下所示:

byte[] myXmlFile = MyProject.Properties.Resources.PrinterMap;

您还可以将XML数据添加为字符串并直接解析XML。

您是否尝试过
Application.GetContentStream(新Uri(“/Settings/ReportMap.XML”,UriKind.Relative))?@sthotakura感谢您的回复。该字符串在单步执行调试器时有效,但在运行已发布的exe时失败。我的申请失败了。其他信息:找不到路径“C:\Users\Alan Wayne\AppData\Local\Apps\2.0\3RPPH36W.WAY\MN0L8QBO.1R4\nurs..tion_f6d771115904d935_0001.0000_f6a09aeb8aab12a5\Settings\ReportMap.xml”的一部分:(您是否检查了该文件是否存在于该位置(C:\Users\Alan Wayne\AppData\Local\Apps\2.0\3RPPH36W.WAY\MN0L8QBO.1R4\nurs..tion\u f6d771115904d9‌​35_0001.0000_f6a09aeb8aab12a5\Settings)?@sthotakura是的。请参阅本文的最后一个答案。它表示clickonce应用程序对clickonce和xml文件的处理有所不同。