- PR -

Dllにアイコンを埋め込むには?

投稿者投稿内容
gorisaku
ベテラン
会議室デビュー日: 2004/04/17
投稿数: 95
投稿日時: 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を作成したいのです。

まだまだ初心者なので調べながら開発をしておりますが、
ご教授いただければと思います。
よろしくお願いいたします。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 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
gorisaku
ベテラン
会議室デビュー日: 2004/04/17
投稿数: 95
投稿日時: 2004-08-19 16:38
一郎殿 お返事ありがとうございます。

引用:

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



上記を早速試してみようと思います。
処理結果は改めて記述したいと思います。
貴重なご助言に感謝いたします。
ありがとうございます。
gorisaku
ベテラン
会議室デビュー日: 2004/04/17
投稿数: 95
投稿日時: 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をプログラムで使用することが出来るのでしょうか?
更に分からなくなってしまいました。
ご助言お願いいたします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-08-19 23:50
諸農です。

ちょっとベタな方法です。
最初にリソースを格納するアセンブリクラスを作成します。
ここではプロジェクト名をMyImage、クラス名が「Class1」で、
呼び出すリソースのキーが「ICO」とします。

コード:

using System;
using System.Drawing;
using System.Resources;

namespace MyImage
{
public class Class1
{
public Class1(){}
public Icon GetIcon()
{
ResourceManager rs = new ResourceManager(typeof(Class1));
return (Icon)rs.GetObject("ICO");
}
}
}



次にリソースファイルを作成するアプリ(プロジェクト)を作成します。
ここではResGenプロジェクトとします。

ボタン1クリックでアイコンファイルの選択を行い、
選択されたアイコンを元にリソースを作成します。
リソースファイルは、格納するアセンブリのクラス名「Class1」を使って
「Class1.resources」とし、キー名を「ICO」にします。
コード:

private void button1_Click(object sender, System.EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
ResourceWriter rw = new ResourceWriter("Class1.resources");
rw.AddResource("ICO",new Icon(openFileDialog1.FileName);
rw.Generate();
}
}



続いて、ResGenプロジェクトで作成したリソースファイル(Class1.resources)を
MyImageプロジェクトに既存項目の追加で追加します。

さらに、MyImageプロジェクトで作成されるアセンブリを利用するプロジェクトを
作成します。ここではResTestプロジェクトとします。
参照ノードで参照の追加を行い、MyImageプロジェクトを参照追加します。
ボタンクリックイベントハンドラを作成して、次のコードを記述します。

コード:

private void button1_Click(object sender, System.EventArgs e)
{
MyImage.Class1 c1 = new MyImage.Class1();
pictureBox1.Image = c1.GetIcon().ToBitmap();
}



ソリューション全体をビルドし、ResTestプロジェクトを実行すると
MyImageプロジェクトで作成されたアセンブリに取り込んだリソースに
格納されているアイコンがフォームのPictureBoxに表示されます。

#キー名が間違っていたのを修正しました。

_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2004-08-19 23:54 ]
gorisaku
ベテラン
会議室デビュー日: 2004/04/17
投稿数: 95
投稿日時: 2004-08-20 09:55
諸農殿 お返事ありがとうございます。
作成してみましたがうまく動作しませんでした。
(作成方法が悪いと思うのですが・・・)
確認なのですが・・・
 MyImageはDllになりますよね??
 
もう一度作成してみます。
取り急ぎご報告まで・・・
gorisaku
ベテラン
会議室デビュー日: 2004/04/17
投稿数: 95
投稿日時: 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 デバッガに設定されなければなりません。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

再度お返事をいただけますと幸いでございます。
gorisaku
ベテラン
会議室デビュー日: 2004/04/17
投稿数: 95
投稿日時: 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を作成できればと思っております。
再度ご教授願えませんでしょうか?
よろしくお願いいたします。

スキルアップ/キャリアアップ(JOB@IT)