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

null ストリームを返しています。リソースをリストした

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

上記のようにコマンドラインで、または image.png ファイルの LogicalName プロパティを設定して SharpDevelop 内で、この識別子を上書きすることもできます。これを設定するには、[プロジェクト] ウィンドウでファイルを右クリックし、[プロパティ] を選択します。

あなたの状況では、画像に独自の論理名を設定したくなるでしょう。したがって、論理名に 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 に答える