您可以通过文件的属性指定项目中的文件会发生什么:
Build Action 到 Resource 和 Copy To Output Directory 到 Copy always 将意味着该文件将作为文件复制到解决方案的输出目录(即您可以在资源管理器中看到它)。
如果您在应用程序中使用该文件,它必须存在于磁盘上指定的绝对或相对路径中。否则你会得到你描述的错误。如果我理解正确,您想创建一个自包含的可执行文件,无论它被复制到哪里,它都会运行。这意味着您的应用程序不能依赖任何外部文件。
要解决这个问题,您需要将所有外部文件嵌入到可执行文件中,并更改您的代码以使用这些嵌入文件,而不是期望磁盘上的文件。
以下是一种帮助您入门的方法:
public static byte[] GetResourceAsByteArray(string filename)
{
var assembly = Assembly.GetCallingAssembly();
using (var resFilestream = assembly.GetManifestResourceStream(filename))
{
if (resFilestream == null) return null;
var ba = new byte[resFilestream.Length];
resFilestream.Read(ba, 0, ba.Length);
return ba;
}
}
要使用它,您需要将文件的构建操作设置为Embedded Resource,并使用文件的完全限定名称调用方法,其中名称组合如下:
[RootNameSpaceOfTheProject].[NameOfFolderInTheProject].[FileNameWithExtension]
例子:
调用方法:
var b = ResourceOperations.GetResourceAsByteArray("Store.Resources.EmbeddedIcons.toolbox.png");
现在您可以将字节数组写入临时文件并将其用作图像源,或者您可以直接从字节数组构建图像。至少,你有你的数据......