趣味でプログラミングをしています。
[質問の概要]
開発環境( 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ファイルに相当する何かがあるはずなのですが…
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 08:00
2020/09/27 08:10
2020/10/03 08:15 編集