2013-04-13 55 views
0

我正在製作一個遊戲引擎並想知道如何加載資源。資源加載在SharpDevelop中工作,但不是在手動編譯時

我正在使用此代碼。

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

雖然我不能告訴你在裝配中加載資源的最佳方式,但我可以告訴你問題是什麼。

如果您從命令行運行MSBuild,您將會看到,當SharpDevelop構建項目時,它將使用稍微不同的命令行選項。假設的MSBuild是你的路徑,然後運行像下面會告訴你什麼是傳遞給CSC命令行選項上:

msbuild /t:Rebuild YourSolution.sln 

的/ RES /或資源參數看起來有點不同。這將是這樣的:

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

如果你讀的文檔/resource compiler option你會看到,它允許你指定一個標識符是作爲嵌入的資源名稱的名稱。在此標識符上面的例子中是

YourAssemblyRootNamespace.Resources.image.png 

您還可以覆蓋該標識符在命令行,如上圖所示,或通過設置LogicalName屬性爲image.png文件內SharpDevelop的。要設置它,請右鍵單擊「項目」窗口中的文件,然後選擇「屬性」。

在你的情況下,我會試圖設置我自己的圖像的邏輯名稱。所以,如果你使用image.png你的邏輯名稱,然後你佔用資源的方法變得更簡單:

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 
+0

感謝馬特。我將要求用戶將邏輯名稱設置爲sharpdevelop之類的邏輯名稱,如果他們正在使用其他名稱。你有什麼建議? –

+0

不確定。命名空間和資源名稱應該足以使其獨特,如果您要合併來自其他程序集的資源。 –

相關問題