質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

2736閲覧

開発環境無しでリソースを実行ファイルにセットする方法

BeatStar

総合スコア4962

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/09/25 09:28

編集2020/09/27 07:59

趣味でプログラミングをしています。

[質問の概要]
開発環境( VC# 等 ) を使わずにリソースを実行ファイルにセットする方法が知りたい
(リソースファイルの書き方とコマンドライン、実行ファイルから使う方法の三つ)

VC#をインストールせずに csc.exe で直接

$ csc /nologo /target:winexe /out:Main.exe main.cs

のように指定するだけでC#での実行ファイルが作れることが解りました。

そこで、MinGW でなら rcファイルを生成してwindres でコンパイルして実行ファイルに埋めるように、
C# でも 「VC#等を使わずに」、リソースファイルを埋め込めないかと考え、

『C# リソース csc』と検索してみました。

すると、

結果1: URL1

結果2: URL2

のようにVC#を使う方法しか見当たりません…
(私の検索の仕方がアレなのかもしれませんが)

csc で直接 $ csc -res:<リソースファイル> みたいにするか、
MinGW だと windres に相当するような何かでやって…とかの可能性もありますが。

どなたか、『cscで直接リソースを埋め込む方法』をご存知の方、宜しくお願いします。

[情報]
言語: C#
開発環境: 無し. csc で直接
.NET Framework: (できれば) 2.0


[追記1]

確かに見落としてました…。
ですが私のやり方が悪いのか、やはり失敗します。

まず、

C#

1using System; 2using System.Drawing; 3using System.Windows.Forms; 4using System.IO; 5using System.Reflection; 6 7 8namespace Sample{ 9 class Prog{ 10 [STAThread] 11 static void Main(){ 12 Form1 form1 = new Form1(); 13 Application.Run( form1 ); 14 } 15 } 16 17 class Form1 : Form{ 18 private WebBrowser webBrowser1; 19 private ToolStrip toolStrip1; 20 private ToolStripButton toolStripButton1; 21 private ToolStripButton toolStripButton2; 22 private ToolStripButton toolStripButton3; 23 24 public Form1(){ 25 26 this.SuspendLayout(); 27 28 this.toolStrip1 = new ToolStrip(); 29 30 // ツールバーのレイアウトを一時的停止 31 this.toolStrip1.SuspendLayout(); 32 33 // ツールバーに追加するコントロールの生成 34 this.toolStripButton1 = new ToolStripButton(); 35 this.toolStripButton1.Text = "戻る(&P)"; 36 //this.toolStripButton1.Image = Image.FromFile(@"image1.jpg"); 37 //this.toolStripButton1.DisplayStyle = ToolStripItemDisplayStyle.Image; 38 39 this.toolStripButton2 = new ToolStripButton(); 40 this.toolStripButton2.Text = "ホーム(&M)"; 41 //this.toolStripButton2.Image = Image.FromFile(@"image3.jpg"); 42 //this.toolStripButton2.DisplayStyle = ToolStripItemDisplayStyle.Image; 43 toolStripButton2.Height = 100; 44 45 this.toolStripButton3 = new ToolStripButton(); 46 this.toolStripButton3.Text = "次へ(&N)"; 47 //this.toolStripButton3.Image = Image.FromFile(@"image3.jpg"); 48 //this.toolStripButton3.DisplayStyle = ToolStripItemDisplayStyle.Image; 49 toolStripButton2.Height = 100; 50 51 // ツールバーに登録 52 this.toolStrip1.Items.Add( this.toolStripButton1 ); 53 this.toolStrip1.Items.Add( this.toolStripButton2 ); 54 this.toolStrip1.Items.Add( this.toolStripButton3 ); 55 56 // ウィンドウにツールバーを登録 57 this.Controls.Add( this.toolStrip1 ); 58 59 // ツールバーのレイアウト再開 60 this.toolStrip1.ResumeLayout(false); 61 this.toolStrip1.PerformLayout(); 62 63 // WebBrowserコントロールを作成 64 /* 65 webBrowser1 = new WebBrowser(); 66 webBrowser1.Dock = DockStyle.Fill; 67 webBrowser1.Name = "webBrowser1"; // コントロールとしてフォーム上に追加 68 this.Controls.Add(webBrowser1); // Webページを表示 69 webBrowser1.Navigate("パス"); 70 //webBrowser1.Size = new Size( 500, 500 ); 71 //webBrowser1.Location = new Point( 10, 10 ); 72 webBrowser1.Navigated += new WebBrowserNavigatedEventHandler( webBrowser1_Navigated ); 73 webBrowser1.DocumentTitleChanged += new EventHandler( webBrowser1_DocumentTitleChanged ); 74 */ 75 this.Size = new Size( 500, 500 ); 76 77 var assm = Assembly.GetExecutingAssembly(); 78 79 // リソースとして埋め込んだ画像ファイルのストリームを取得 80 using (var stream = assm.GetManifestResourceStream("Sample.abc.bmp")) { 81 // 取得したストリームからImageを作成し、背景に設定する 82 this.BackgroundImage = Image.FromStream(stream); 83 this.BackgroundImageLayout = ImageLayout.Center; 84 85 // 過去のバージョンの.NET Frameworkでは、Imageの作成元のStreamを閉じてしまうと例外がスローされた 86 // こういった場合は、次のように一旦ストリームの内容をMemoryStream等にコピーする必要がある 87 88 var memoryStream = new MemoryStream((int)stream.Length); 89 90 stream.CopyTo(memoryStream); 91 92 this.BackgroundImage = Image.FromStream(memoryStream); 93 this.BackgroundImageLayout = ImageLayout.Center; 94 95 } 96 97 98 99 this.ResumeLayout(false); 100 this.PerformLayout(); 101 } 102 103 // Updates the URL in TextBoxAddress upon navigation. 104 private void webBrowser1_Navigated( object sender, WebBrowserNavigatedEventArgs e){ 105 //this.Text = webBrowser1.Url.ToString(); 106 } 107 108 private void webBrowser1_DocumentTitleChanged( object sender, EventArgs e ){ 109 //this.Text = webBrowser1.DocumentTitle; 110 //this.Text = webBrowser1.StatusText; 111 } 112 } 113}

という風にしておいて、

makefileに

# TargetやCscPath等は変数状態で指定しています $(Target): main.cs $(CscPath)/csc /nologo /resource:.\abc.bmp /target:winexe /out:$(Target) main.cs

のようにコンパイルしました。

生成時のディレクトリ内にabc.bmpがあるとします。

これを起動しようとしても(恐らく例外が飛んでいる系だろうけど…)起動すらしません。

ファイルから読み込んでやるときにファイルが無い時に、同じような現象が起きていることから、
『ファイルが無いから』だと思うのですが、Windows API (C言語上で)のときのようにリソースファイル
( WinAPIだと rcファイルに相当 ) が必要なのではないかと思うのですが…。

しかし
https://smdn.jp/programming/netfx/embeddedresource/#embedresource_commandline
ではそういう書き方がほとんど無いようなので…

適当に書いていいのならいいですが、確実に決まったやり方があるはずなので…。

VC# をインストールしていないのでチェックすることすら…。


[追記2]

もうちょっと深く潜ってみました。

参考ではちょっとスタイリッシュなアクセス方法ですが、
肝心の(WinAPIでのrcファイルに相当する)リソースファイルの書き方が提示されていません…。

概要を見る限り、rcファイルに相当する何かがあるはずなのですが…

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

URL2の方に
コマンドラインでのリソースの埋め込み
がありますが、だめでしたか?

投稿2020/09/25 09:44

SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2020/09/27 08:00

SHOMIさん、ご回答ありがとうございます。 質問本文に追記しました。
BeatStar

2020/10/03 08:15 編集

出来ました! C#の場合はrcファイルに相当するファイルは不要みたいですね… (個人的な理由でチェックとteratailアクセスが遅くなりました…)
guest

0

一応、似たような状況に陥ってしまった人向けに書いておきますね。

どうやら、「名前空間の指定」は要らなかったようです。

$(CscPath)/csc /nologo /resource:.\abc.bmp /target:winexe /out:$(Target) main.cs

のようにリソースとする画像ファイル等を設定して、

var assm = Assembly.GetExecutingAssembly(); // リソースとして埋め込んだ画像ファイルのストリームを取得 using (var stream = assm.GetManifestResourceStream("abc.bmp")) { // 取得したストリームからImageを作成し、背景に設定する this.BackgroundImage = Image.FromStream(stream); this.BackgroundImageLayout = ImageLayout.Center;

(2.0)

のように単純にファイル名を指定すればよかったようです。

(Windows API + C++ の場合に引きずられていた…)

投稿2020/10/03 08:14

BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問