- - PR -
Dllにアイコンを埋め込むには?
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-08-19 15:25
VS.NET2003(C#)でプログラム開発をしております。
よく使用するアイコンをDll化(Imagelist)し利用したいと思い 作成したのですが、うまく動作しませんでした。 下記のコードですが ------------------------------------------------------------ public static System.Drawing.Bitmap DB; public static ImageList Pr_ImageList = new ImageList(); DB = new System.Drawing.Bitmap(@"H:\Program\Source\Icon\Exit.ico"); Pr_ImageList.Images.Add(DB); ------------------------------------------------------------ このコードですとDllが毎回呼ばれるたびにicoファイルを検索?? に行き、存在しないとエラーを返すと思います。 (実際にはそうなりましたが・・・) このようにではなくIamgelistに複数のicoをはじめから組み込みした 形のDllを作成したいのです。 まだまだ初心者なので調べながら開発をしておりますが、 ご教授いただければと思います。 よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2004-08-19 15:54
ResEditorというのがあると思いますので、それを使ってresourcesファイルを作り、アセンブリに組み込んではどうでしょうか。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbtskcreatingresourcefileswithreseditor.asp 組み込んだリソースの取り出し方はこちら http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbtskretrievingresourceswithresourcemanager.asp | ||||||||||||
|
投稿日時: 2004-08-19 16:38
一郎殿 お返事ありがとうございます。
上記を早速試してみようと思います。 処理結果は改めて記述したいと思います。 貴重なご助言に感謝いたします。 ありがとうございます。 | ||||||||||||
|
投稿日時: 2004-08-19 19:35
先ほどの助言どおり作成してみましたが
いろいろ不都合が・・・ Dllにすると以下のようなエラーが出てきており、 どうすればよいか不明です。 ---------------------------------------------------------------------- System.Resources.MissingManifestResourceException' のハンドルされていない例外が mscorlib.dll で発生しました。 追加情報 : 指定されたカルチャ (またはニュートラル カルチャ) に必要なリソースがアセンブリに見つかりません。"WindowsApplication8.Cls_Icon.resources" が、アセンブリ "CL" に正しく埋め込まれているか、またはリンクされているかを確認してください。 baseName: WindowsApplication8.Cls_Icon locationInfo: <null> resource file name: WindowsApplication8.Cls_Icon.resources assembly: CL, Version=1.0.1692.35080, Culture=neutral, PublicKeyToken=null ---------------------------------------------------------------------- また、どの様にすれば効率的にDllにアイコンを埋め込み そのDllをプログラムで使用することが出来るのでしょうか? 更に分からなくなってしまいました。 ご助言お願いいたします。 | ||||||||||||
|
投稿日時: 2004-08-19 23:50
諸農です。
ちょっとベタな方法です。 最初にリソースを格納するアセンブリクラスを作成します。 ここではプロジェクト名をMyImage、クラス名が「Class1」で、 呼び出すリソースのキーが「ICO」とします。
次にリソースファイルを作成するアプリ(プロジェクト)を作成します。 ここではResGenプロジェクトとします。 ボタン1クリックでアイコンファイルの選択を行い、 選択されたアイコンを元にリソースを作成します。 リソースファイルは、格納するアセンブリのクラス名「Class1」を使って 「Class1.resources」とし、キー名を「ICO」にします。
続いて、ResGenプロジェクトで作成したリソースファイル(Class1.resources)を MyImageプロジェクトに既存項目の追加で追加します。 さらに、MyImageプロジェクトで作成されるアセンブリを利用するプロジェクトを 作成します。ここではResTestプロジェクトとします。 参照ノードで参照の追加を行い、MyImageプロジェクトを参照追加します。 ボタンクリックイベントハンドラを作成して、次のコードを記述します。
ソリューション全体をビルドし、ResTestプロジェクトを実行すると MyImageプロジェクトで作成されたアセンブリに取り込んだリソースに 格納されているアイコンがフォームのPictureBoxに表示されます。 #キー名が間違っていたのを修正しました。 _________________ 諸農和岳 Powered by Borland Delphi/C++Builder & Microsoft VS.NET [ メッセージ編集済み 編集者: Jubei 編集日時 2004-08-19 23:54 ] | ||||||||||||
|
投稿日時: 2004-08-20 09:55
諸農殿 お返事ありがとうございます。
作成してみましたがうまく動作しませんでした。 (作成方法が悪いと思うのですが・・・) 確認なのですが・・・ MyImageはDllになりますよね?? もう一度作成してみます。 取り急ぎご報告まで・・・ | ||||||||||||
|
投稿日時: 2004-08-20 10:22
諸農殿
再度試してみましたがやはりうまくいきません。 下記はエラー内容です。 どの点で間違っているのでしょうか?? 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 このダイアログ ボックスではなく、Just-In-Time (JIT) デバッグを呼び出すための詳細については、 このメッセージの最後を参照してください。 ************** 例外テキスト ************** System.Resources.MissingManifestResourceException: 指定されたカルチャ (またはニュートラル カルチャ) に必要なリソースがアセンブリに見つかりません。"Class1.resources" が、アセンブリ "MyImage" に正しく埋め込まれているか、またはリンクされているかを確認してください。 baseName: Class1 locationInfo: MyImage.Class1 resource file name: Class1.resources assembly: MyImage, Version=1.0.1693.18538, Culture=neutral, PublicKeyToken=null at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture) at System.Resources.ResourceManager.GetObject(String name) at MyImage.Class1.GetIcon() in h:\program\source\test_backup\yama\myimage\class1.cs:line 21 at ResTest.Form1.button1_Click(Object sender, EventArgs e) in h:\program\source\test_backup\yama\restest\form1.cs:line 101 at System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc(Message& m) at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ************** 読み込まれたアセンブリ ************** mscorlib アセンブリ バージョン : 1.0.5000.0 Win32 バージョン : 1.1.4322.573 コードベース : file:///d:/windows/microsoft.net/framework/v1.1.4322/mscorlib.dll ---------------------------------------- ResTest アセンブリ バージョン : 1.0.1693.18539 Win32 バージョン : 1.0.1693.18539 コードベース : file:///H:/Program/Source/TEST_BACKUP/YAMA/ResTest/bin/Debug/ResTest.exe ---------------------------------------- System.Windows.Forms アセンブリ バージョン : 1.0.5000.0 Win32 バージョン : 1.1.4322.573 コードベース : file:///d:/windows/assembly/gac/system.windows.forms/1.0.5000.0__b77a5c561934e089/system.windows.forms.dll ---------------------------------------- System アセンブリ バージョン : 1.0.5000.0 Win32 バージョン : 1.1.4322.573 コードベース : file:///d:/windows/assembly/gac/system/1.0.5000.0__b77a5c561934e089/system.dll ---------------------------------------- System.Drawing アセンブリ バージョン : 1.0.5000.0 Win32 バージョン : 1.1.4322.573 コードベース : file:///d:/windows/assembly/gac/system.drawing/1.0.5000.0__b03f5f7f11d50a3a/system.drawing.dll ---------------------------------------- System.Xml アセンブリ バージョン : 1.0.5000.0 Win32 バージョン : 1.1.4322.573 コードベース : file:///d:/windows/assembly/gac/system.xml/1.0.5000.0__b77a5c561934e089/system.xml.dll ---------------------------------------- MyImage アセンブリ バージョン : 1.0.1693.18538 Win32 バージョン : 1.0.1693.18538 コードベース : file:///H:/Program/Source/TEST_BACKUP/YAMA/ResTest/bin/Debug/MyImage.DLL ---------------------------------------- mscorlib.resources アセンブリ バージョン : 1.0.5000.0 Win32 バージョン : 1.1.4322.573 コードベース : file:///d:/windows/assembly/gac/mscorlib.resources/1.0.5000.0_ja_b77a5c561934e089/mscorlib.resources.dll ---------------------------------------- System.Windows.Forms.resources アセンブリ バージョン : 1.0.5000.0 Win32 バージョン : 1.1.4322.573 コードベース : file:///d:/windows/assembly/gac/system.windows.forms.resources/1.0.5000.0_ja_b77a5c561934e089/system.windows.forms.resources.dll ---------------------------------------- ************** JIT デバッグ ************** Just-In-Time (JIT) デバッグを有効にするには、 このアプリケーション、またはコンピュータ (machine.config) の構成ファイルの jitDebugging 値を system.windows.forms セクションで設定しなければなりません。 アプリケーションはまた、デバッグを 有効にしてコンパイルされなければなりません。 例 : <configuration> <system.windows.forms jitDebugging="true" /> </configuration> JIT デバッグが有効なときは、このダイアログで処理するよりも、ハンドルされていない例外はすべて コンピュータに登録された JIT デバッガに設定されなければなりません。 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 再度お返事をいただけますと幸いでございます。 | ||||||||||||
|
投稿日時: 2004-08-20 11:18
諸農殿
参考にさせて頂いたコードでうまく実行できました。 ありがとうございます。 しかし、Imagelistを生成しようと試してみましたが、 やはりうまくいきません。 やりたかったことはDllにImagelistを埋め込み、 いろいろなプログラムのアイコンをそこから取得して設定したかったのです。 単純に public Icon GetIcon() { ResourceManager rs = new ResourceManager(typeof(Class1)); return (Icon)rs.GetObject("ICO"); } のIconをImagelistに変更したのですが・・・ もちろんResGenも若干変更しました。 エラーとしては下記のエラーとほぼ同じでした。 出来ればImagelistを作成できればと思っております。 再度ご教授願えませんでしょうか? よろしくお願いいたします。 |