资源加载在SharpDevelop中有效,但在手动编译时无效

时间:2013-04-13 05:18:37

标签: c# loading embedded-resource

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

我目前正在使用此代码。

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)

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

msbuild /t:Rebuild YourSolution.sln

/ res或/ resource参数看起来会有所不同。它将类似于:

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

如果您阅读/resource compiler option上的文档,您将看到它允许您指定一个标识符,该标识符是用作嵌入式资源名称的名称。在上面的示例中,此标识符为

YourAssemblyRootNamespace.Resources.image.png

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

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

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

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

如果使用/ res命令行选项,这在使用SharpDevelop进行编译时或在命令行上都有效:

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

它也可以使用您尝试使用的命令行选项:

/res:Resources\image.png