0

我正在制作一个游戏引擎并想知道如何加载资源。

我目前正在使用此代码。

public static Stream GetResourceStream(string name) {
    string asmname = Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location).Replace('\\', '.').Replace('/', '.');
    return Assembly.GetEntryAssembly().GetManifestResourceStream(asmname + "." + name.Replace('\\', '.').Replace('/', '.'));
}

并将其用作

Image img = Image.FromStream(GetResourceStream("Resources/image.png"));

它在 SharpDevelop 中以当前形式工作,但如果我从命令行编译源代码

csc.exe /t:winexe /res:Resources/image.png Game.cs

它正在返回空流。列出了资源

foreach (var name in typeof(this).Assembly.GetManifestResourceNames())
{
    MessageBox.Show(name);
}

它是具有简单名称的列表图像,没有包名称或文件夹名称。

在入口程序集中加载资源的最佳方法是什么?(我会有一个单独的 GameEngine.dll)

谢谢。

4

1 回答 1

1

虽然我无法告诉您在程序集中加载资源的最佳方式,但我可以告诉您问题所在。

如果您从命令行运行 MSBuild,您将看到当 SharpDevelop 构建您的项目时,它使用的命令行选项略有不同。假设 MSBuild 在您的路径上,然后运行类似以下内容将显示正在传递给 csc 的命令行选项:

msbuild /t:Rebuild YourSolution.sln

/res 或 /resource 参数看起来会有些不同。它会是这样的:

/resource:Resources\image.png,YourAssemblyRootNamespace.Resources.image.png 

如果您阅读有关/resource 编译器选项的文档,您将看到它允许您指定一个标识符,该标识符是用作嵌入式资源名称的名称。在上面的例子中,这个标识符是

YourAssemblyRootNamespace.Resources.image.png

您还可以在命令行上覆盖此标识符,如上所示,或在 SharpDevelop 中通过设置 image.png 文件的 LogicalName 属性。要设置它,请右键单击“项目”窗口中的文件并选择“属性”。

在您的情况下,我很想为图像设置自己的逻辑名称。因此,如果您使用 image.png 作为逻辑名称,那么您的 GetResource 方法会变得更简单:

public static Stream GetResourceStream(string name) {
    return Assembly.GetEntryAssembly().GetManifestResourceStream(name);
}

Stream stream = GetResourceStream("image.png");

这在使用 SharpDevelop 编译时或在使用 /res 命令行选项的命令行上都应该有效:

/res:Resources\image.png,image.png

它也应该使用您尝试使用的命令行选项工作:

/res:Resources\image.png
于 2013-04-14T09:15:09.863 回答