【发布时间】:2020-02-09 00:32:26
【问题描述】:
问题
我的解决方案由几个项目组成。 UI 的主要部分我们称之为 Assistant,后端我们称之为 AssistantLib。
结构如下:
在 AssistantLib 中,我将 PDF 作为资源包含在 Resources 文件夹中,Build Action 为 Content,Copy to Output Directory 为 Copy Always。通过使用这些组合进行调试时,我可以找到它们:
private string GetArtifactPath(string artifactName)
{
return Path.Combine(GetResourcePath(), artifactName);
}
public static string GetResourcePath()
{
return Path.Combine(Directory.GetCurrentDirectory(), "Resources");
}
这行得通。从 GetArtifactPath 返回字符串后,我将使用 Process 对象和 AcroRd32.exe 打开文件。
请注意,我需要通过文件路径引用这些文件。它们不是阅读或流式传输的简单 txt。我还需要能够使用AcroRd32.exe 提供的某些标志打开它们。这意味着我必须有文件路径。
我遇到的问题是,一旦我发布 ClickOnce 应用程序,我就会收到找不到文件的错误消息:
Error: Could not find a part of the path 'C:\Users\EL-C\AppData\Local\Apps\2.0\3JCPDD49.7G5\9122AMZE.NZL\azte..tion_edea8654ffceff97_0001.0000_447ed0da08290357\Resources\Guidelines\3.2'.. Stacktrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
当然,当我去那个位置时,资源并不存在。
我的尝试
- 我已将
Build Action更改为 Embedded Resource & None - 结果相同 - 我已将
Copy Output Directory更改为“请勿复制” - This 不适用,因为我无法流式传输这些资源,它们不是简单的文本文件。我也不是要阅读它们,而是要打开它们。
-
This 也不适用,因为在我的情况下引用
MyNamespace.Properties.Resources.My_Zip_File;不起作用。我事先不知道资源的名称。
更新
我正在研究构建后的事件。在这样做的过程中,我发现这些资源已经在构建之后的输出目录中:
但由于某种原因,它们在我发布时没有出现:
更新 2
为了说明文件夹结构如何影响这一点,这里是之前和之后。
当资源位于 AssistantLib(例如 EVMSBP)时,结构如下:
这是使用 AssistantLib 中的资源安装后 ClickOnce 发布文件夹的样子:
或者,当资源位于 Assistant(同样是 EVMSBP)中时,结构如下:
这是使用Assistant 中的资源安装后 ClickOnce 发布文件夹的样子:
据我所知,资源必须是启动项目的一部分。这听起来很疯狂?
我错过了什么?
【问题讨论】:
-
不要使用
Directory.GetCurrentDirectory()。您不知道哪个目录将是当前。根据项目类型,可以使用AppDomain.CurrentDomain.BaseDirectory、Application.StartupPath、AppContext.BaseDirectory、Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)等(Environment.CurrentDirectory也不好) -
嗨,用户,我知道您的所有 pdf 文件都会在构建操作时被复制到输出目录,对吗?
-
@Clint - 我玩过一些设置。在当前的迭代中,他们这样做了。也许我不完全了解输出目录在哪里?
-
你的exe所在的目录
-
是的,看看我的编辑。在构建时,它们被放置在那里;不在 Publish 上,这非常令人沮丧。
标签: c# .net clickonce visual-studio-2019