C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: ライブラリの自作DLLに参照DLLに埋め込みたい


(過去ログ 91 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■54343 / inTopicNo.1)  ライブラリの自作DLLに参照DLLに埋め込みたい
  
□投稿者/ めめ (10回)-(2010/10/14(Thu) 12:08:20)

分類:[C#] 

ライブラリを作成するとTest.DLLとなって、
これを参照したメインプロジェクトはA.exeとText.DLLが必要になるようになりました。

ここまでは良いのですが、
Test.DLLの機能を充実させる内にInterop.SHDocVw.dll、Interop.IWshRuntimeLibrary.dllなど
ライブラリの中で参照してしまったDLLも増え始めて、メインプロジェクトはDLLがたくさんになっています。

私はそれに対して、見た目の問題だけですが、少し汚いような印象を受けました。


この場合Test.DLLなので、Interop系を呼び出すのは外部ファイルとして書き出さず、Test.DLLに埋め込む?
なるべく外に見えないようにするような方法はないでしょうか?

よろしくお願いします。

引用返信 編集キー/
■54344 / inTopicNo.2)  Re[1]: ライブラリの自作DLLに参照DLLに埋め込みたい
□投稿者/ todo (61回)-(2010/10/14(Thu) 12:17:38)
アプリケーションのEXEファイルやDLLファイルを1つにまとめるには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/426ilmerge/ilmerge.html
引用返信 編集キー/
■54346 / inTopicNo.3)  Re[1]: ライブラリの自作DLLに参照DLLに埋め込みたい
□投稿者/ 魔界の仮面弁士 (1870回)-(2010/10/14(Thu) 12:29:41)
No54343 (めめ さん) に返信
> この場合Test.DLLなので、Interop系を呼び出すのは外部ファイルとして書き出さず、Test.DLLに埋め込む?
> なるべく外に見えないようにするような方法はないでしょうか?

C# 2010 からは、COM の型情報の埋め込みがサポートされるようになったようです。
http://msdn.microsoft.com/ja-jp/library/ee317478.aspx

それ以前の環境だと、該当する interface 等を自分で手書きしておくか、
コンパイル後に ILMerge で連結するなどの手間が必要になるかと。
引用返信 編集キー/
■54347 / inTopicNo.4)  Re[1]: ライブラリの自作DLLに参照DLLに埋め込みたい
□投稿者/ shu (105回)-(2010/10/14(Thu) 12:40:41)
No54343 (めめ さん) に返信
メインプロジェクトにある参照を減らしたいということですか?
参照の中にある不要なDLL参照を削除するだけでは駄目ですか?
引用返信 編集キー/
■54352 / inTopicNo.5)  Re[2]: ライブラリの自作DLLに参照DLLに埋め込みたい
□投稿者/ とっちゃん (551回)-(2010/10/14(Thu) 13:28:02)
とっちゃん さんの Web サイト
No54343 (めめ さん) に返信

No54346 で魔界の仮面弁士さんが書いているように、VS2010であれば、COMInteropの埋め込み機能を使う
ことでいくつかのInterop系のDLLはなくすことができます。

また、IWshRuntimeLibrary は、WSH(WindowsScriptingHost)のランタイムを呼び出していますが
スクリプトを動かす必要があるのでしょうか?
必要があるのであれば仕方ありませんが、不要なら参照を解除することで必要なくなります。

SHDocVw はもしかしたらHTMLを表示するための機能を追加したら出てきた。。。ではありませんか?
もし、これら両方が特定のHTMLを表示するための。。。であれば
WSH側はHTML内のスクリプトの実行には必要ありません(ブラウザホストの仕事のため)。
また、ブラウザコントロールは .NET 2.0 以降であれば .NET 側が提供していますので
そちらを利用することができます。
WinFormsなら System.Windows.Forms.WebBrowser クラスを、WPFの場合は
System.Windows.Controls.WebBrowser クラスがブラウザコントロールとなります。

ここであげた2例以外にももしかしたら同じようなものがあるかもしれません。
気になるようなら個別にこれは?と聞いてみることをお勧めします。
オブジェクトブラウザを参照してそのDLLを参照したら何が使えるようになったか
も書き添えておけば、より的確な回答が得られるかもしれませんよ。

引用返信 編集キー/
■54384 / inTopicNo.6)  Re[2]: ライブラリの自作DLLに参照DLLに埋め込みたい
□投稿者/ めめ (11回)-(2010/10/16(Sat) 18:09:55)

返信ありがとうございます。

>C# 2010 からは、COM の型情報の埋め込みがサポートされるようになったようです。
http://msdn.microsoft.com/ja-jp/library/ee317478.aspx

この内容を参考にして、いろいろ試していたのですが上手くいっていません。
もしかして、.NET Framework 4しか、埋め込みできないのでしょうか?

複数のバージョンの Microsoft Office と連携するアプリケーションを作成するには
の6.がその設定だと思っているのですが、どうもうまくいきません。
(現在は、利用者が手間取らないように.NET2を利用して記述していました。)


>メインプロジェクトにある参照を減らしたいということですか?
>参照の中にある不要なDLL参照を削除するだけでは駄目ですか?

DLLは現在使用しているので、なんとかして無くすというのはあまり好ましく思っていません。
アクティブディレクトリを取得するのに利用したり、ショートカットを作成するのに利用しています。
(DLLを使わない記法も分かりますが、こっちの方がメンテナンスしやすいので、良いと思っています。)
また、今後DLLを使わざるを得ない状況になったときに、
やはり同じ問題解決をしたいと思うはずなので、なるべく埋め込みで解決したいと思っています。




.Net2では、ILMergeのような外部ツールに頼る形になるのでしょうか。

.Net4も少し調べたのですが、Clientと分かれていたりして、まだどうなっているのかよく分かっていません。
ダウンロードで配布するプログラムの場合、利用者が.NETが4がないとエラーになる状況は避けたいなぁ、という感じです。


引用返信 編集キー/
■54387 / inTopicNo.7)  Re[3]: ライブラリの自作DLLに参照DLLに埋め込みたい
□投稿者/ Azulean (625回)-(2010/10/16(Sat) 23:41:33)
No54384 (めめ さん) に返信
> また、今後DLLを使わざるを得ない状況になったときに、
> やはり同じ問題解決をしたいと思うはずなので、なるべく埋め込みで解決したいと思っています。
COM の場合、埋め込み手法が使えると思いますが、一般的なアセンブリ、ネイティブ DLL を埋め込めるわけではありません。
DLL の種類によりますが、単一 exe ファイルだけで配置できるケースは少ないと思います。


> .Net2では、ILMergeのような外部ツールに頼る形になるのでしょうか。
埋め込み先・埋め込み元ともに .NET のアセンブリであれば、ILMerge で事足りるでしょう。


> ダウンロードで配布するプログラムの場合、利用者が.NETが4がないとエラーになる状況は避けたいなぁ、という感じです。
.NET Framework 2.0 も Windows XP には(初期状態では)入っていません。
最近ではそれなりに普及していると思われますが、.NET Framework 2.0 がない可能性もある以上、「○○がないとエラーになる状況は避けたい」というのを実現しているとは思えません。(0にはならないということです)



個人的には、別途インストールをお願いする(.NET がないとエラーになることを容認する)、あるいはインストーラとして setup.exe にすべて含める(自己解凍)といったことも考えるべきだとも思っています。
今後、単一の exe ファイルだけで動かすことができることは少ないと思われますので。
引用返信 編集キー/
■54396 / inTopicNo.8)  Re[3]: ライブラリの自作DLLに参照DLLに埋め込みたい
□投稿者/ shu (109回)-(2010/10/17(Sun) 12:02:01)
No54384 (めめ さん) に返信

> ここまでは良いのですが、
> Test.DLLの機能を充実させる内にInterop.SHDocVw.dll、Interop.IWshRuntimeLibrary.dllなど
> ライブラリの中で参照してしまったDLLも増え始めて、メインプロジェクトはDLLがたくさんになってい> ます。
これが解決したいことだとして、再度確認します。

メインプロジェクトの参照:
(1)A.exe
(2)test.dll
(3)Interop.SHDocVw.dll、Interop.IWshRuntimeLibrary.dllなど

test.dllの参照:
(4)Interop.SHDocVw.dll、Interop.IWshRuntimeLibrary.dllなど

だとして、(3)の参照をなくしたいということではないのですか?
メインプロジェクトで直接(3)のオブジェクトを参照しなければ(3)の
参照は削除してもよいと思うのですが、そういうことではないですか?
もしメインプロジェクトで(3)のオブジェクトを参照しているならば
test.dllでラッピングしたクラスを作成しそれを使うようにすれば良いと思います。

引用返信 編集キー/
■54432 / inTopicNo.9)  Re[4]: ライブラリの自作DLLに参照DLLに埋め込みたい
□投稿者/ めめ (13回)-(2010/10/19(Tue) 23:19:34)

> メインプロジェクトの参照:
> (1)A.exe
> (2)test.dll
> (3)Interop.SHDocVw.dll、Interop.IWshRuntimeLibrary.dllなど
>
> test.dllの参照:
> (4)Interop.SHDocVw.dll、Interop.IWshRuntimeLibrary.dllなど
>
> だとして、(3)の参照をなくしたいということではないのですか?
> メインプロジェクトで直接(3)のオブジェクトを参照しなければ(3)の
> 参照は削除してもよいと思うのですが、そういうことではないですか?

2が3を利用しています。
1も2を経由して3の関数を利用しています。


> もしメインプロジェクトで(3)のオブジェクトを参照しているならば
> test.dllでラッピングしたクラスを作成しそれを使うようにすれば良いと思います。

ラッピングの部分を、簡単でいいやり方がないか探している所です。
今のところはILMergeみたいですが、後から手を入れる感じが気に入らない……という感じに現在はいけるようになりました。


> ダウンロードで配布するプログラムの場合、利用者が.NETが4がないとエラーになる状況は避けたいなぁ、という感じです。
> .NET Framework 2.0 も Windows XP には(初期状態では)入っていません。
最近ではそれなりに普及していると思われますが、.NET Framework 2.0 がない可能性もある以上、「○○がないとエラーになる状況は避けたい」というのを実現しているとは思えません。(0にはならないということです)

このへんはもう、トレードオフと思うことにしています。
XPのサービスパックを入れていないのは、おかしな話になりますし、また、2.0以下はVista以降に問題があります。
となるなら、2.0が最も問題になりにくいかな、と。


とりあえずは、解決の方法が分かったので、解決済みにします。
回答してくれた方々、返信が遅くなって申し訳ありませんでした。どうもありがとうございました!

解決済み
引用返信 編集キー/
■54434 / inTopicNo.10)  Re[5]: ライブラリの自作DLLに参照DLLに埋め込みたい
□投稿者/ Azulean (627回)-(2010/10/19(Tue) 23:55:44)
2010/10/19(Tue) 23:55:53 編集(投稿者)

No54432 (めめ さん) に返信
> XPのサービスパックを入れていないのは、おかしな話になりますし、また、2.0以下はVista以降に問題があります。
> となるなら、2.0が最も問題になりにくいかな、と。

蛇足です。
.NET Framework 2.0 は Windows XP の Service Pack には入ってないはずです。(間違ってたらご指摘ください)
「SP が入っていないのはおかしな話」が、「最新の Service Pack に .NET Framework 2.0 が含まれている」という意味合いであれば、ちょっと足りないかなと思いました。

もちろん、.NET 2.0 が入っている割合は、最近ではかなり高いと思っています。
このため、一部のユーザーのみ、ダウンロード&インストールをお願いする方針はありでしょう。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -