我正在制作游戏引擎并想知道如何加载资源。
我目前正在使用此代码。
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)
感谢。
答案 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