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

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

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

Re[8]: DLLにheadファイル?


(過去ログ 124 を表示中)

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

■73957 / inTopicNo.1)  DLLにheadファイル?
  
□投稿者/ 紅葉の季節 (1回)-(2014/11/17(Mon) 18:34:57)

分類:[.NET 全般] 

ユーザにDLL形で実装した関数やクラスを渡したいですけれども、
ヘッダファイルも提供しなければならないでしょうか。

若し通常必要なら、
ヘッダファイルを省いてもユーザが利用できる特殊方法もあれば
ぜひ教えていただきたいです。

引用返信 編集キー/
■73959 / inTopicNo.2)  Re[1]: DLLにheadファイル?
□投稿者/ 魔界の仮面弁士 (173回)-(2014/11/17(Mon) 19:07:14)
No73957 (紅葉の季節 さん) に返信
> ユーザにDLL形で実装した関数やクラスを渡したいですけれども、
> ヘッダファイルも提供しなければならないでしょうか。

「DLL を何で作るのか」「その DLL はど言語から利用するのか」によって
答えが変わってきます。とりあえず、おおまかな回答をば。


そもそも「DLL による公開」と言っても、幾つかの種類があります。

 (1)関数を公開するタイプ。利用側は DllImportAttiribute 等を通じて呼び出す。
  → USER32.DLL など

 (2)ActiveX / COM として、クラスや構造体を公開するタイプ。
  あらかじめレジストリ登録が必要。利用側は参照設定して使うことが多い。
  → ShDocVw.DLL など

 (3)マネージ DLL として、クラスや構造体を公開するタイプ。参照設定して使う。
  → System.Windows.Forms.DLL など

この他、リソースタイプの DLL などもありますが、今回は該当しないので省略。


(2)や(3)の場合、DLL 内部に型情報を持っているため「参照設定」するだけで使えます。
(1) の場合はそれが無いため、呼び出し側に型情報を伝えるために、
*.lib なり *.h なりを用意しておく方が良いでしょう。
引用返信 編集キー/
■73961 / inTopicNo.3)  Re[2]: DLLにheadファイル?
□投稿者/ 774RR (187回)-(2014/11/17(Mon) 20:01:30)
そもそも C# / VB.NET に「ヘッダ」とか無いような気がするけど・・・

分類が間違っていて C/C++ (native DLL) である、として以下解説するとしよう。

No73959 の (1) のとおり
「インポートライブラリ *.lib 」
最小限の「ヘッダ *.h 」
は提供してあげないと、もらった側で使いようないことになりかねない。

どうしてもヘッダファイルを提供したくないとなると、
日本語(なり英語なり)の解説文書を提供することになりそうだが
結局のところ「使える」レベルの解説文書を提供するならヘッダ提供と同じだね。
もらった側が、解説文書からヘッダファイルを書き下せる程度の解説が必要になるわけだし。
引用返信 編集キー/
■73964 / inTopicNo.4)  Re[3]: DLLにheadファイル?
□投稿者/ 紅葉の季節 (2回)-(2014/11/17(Mon) 22:38:25)
お返答有難うございます。

大変申し訳ございません。
MSWindow 7 Visual Studio2013 VC++言語に限定する話です。
.NETとは無関係です。

native DLLの形でclassのメンバーを提供する場合、ヘッダの提供を省ける方法があれば教えてください。

宜しくお願い致します。



引用返信 編集キー/
■73965 / inTopicNo.5)  Re[4]: DLLにheadファイル?
□投稿者/ Azulean (367回)-(2014/11/17(Mon) 22:47:47)
2014/11/17(Mon) 22:49:13 編集(投稿者)

No73964 (紅葉の季節 さん) に返信
> native DLLの形でclassのメンバーを提供する場合、ヘッダの提供を省ける方法があれば教えてください。

すでに紹介のあるとおり、COM のクラスとして公開するのであれば省けるかもしれません。
ただし、経験がない場合、ヘッダ提供を省いた以上のコストがかかると思われますし、いらぬ不具合リスクを招く恐れがあります。

通常のネイティブクラスとして提供する場合、ヘッダーの提供は不可避と考えてもらってよいでしょう。


ところで、なぜ、ヘッダを提供したくないのでしょうか。
必要のない部分を公開したくないだけであれば、「Pimpl イディオム」を調べていただくと参考になるかもしれません。
引用返信 編集キー/
■73967 / inTopicNo.6)  Re[5]: DLLにheadファイル?
□投稿者/ 774RR (188回)-(2014/11/18(Tue) 08:52:05)
ヘッダファイルってのはコンパイラにとっての使い方マニュアルなわけだし
マニュアルの無い DLL など提供されてもユーザとしては困るだけなので、
何らかの形でヘッダファイルの提供は必須と思うの心。

native DLL は manage EXE から p/invoke できるわけだけど
C++ のクラスの実装を公開したところで C# から使おうとすると結局書き直しだし
単純な native C dllexport な関数だけ公開するのが汎用性高そう。
そうしておけば cygwin の gcc とか C++Builder とかからも使えていい感じ。
EXE/DLL 間のメモリバリアも考えなくてすむ。
自動的に pimpl な実装になる/ならざるを得ないわけで。

fopen/fwrite/fread/fclose なんかはまさに pimpl な実装例だと思う。

引用返信 編集キー/
■73968 / inTopicNo.7)  Re[4]: DLLにheadファイル?
□投稿者/ shu (630回)-(2014/11/18(Tue) 09:03:10)
No73964 (紅葉の季節 さん) に返信
> 大変申し訳ございません。
> MSWindow 7 Visual Studio2013 VC++言語に限定する話です。
> .NETとは無関係です。
>
> native DLLの形でclassのメンバーを提供する場合、ヘッダの提供を省ける方法があれば教えてください。
>
ヘッダの提供を省くことは可能ですが使う側が困るだけです。
方法はDLLだけ渡して使い方の説明を十分に行えばよいかと思います。結局ヘッダに書いた方が良い内容を
使う側が書くことになるだけかと思います。
引用返信 編集キー/
■73969 / inTopicNo.8)  Re[4]: DLLにheadファイル?
□投稿者/ とっちゃん (276回)-(2014/11/18(Tue) 11:32:23)
とっちゃん さんの Web サイト
No73964 (紅葉の季節 さん) に返信
> MSWindow 7 Visual Studio2013 VC++言語に限定する話です。
> .NETとは無関係です。
>
> native DLLの形でclassのメンバーを提供する場合、ヘッダの提供を省ける方法があれば教えてください。
>
naitive DLL形式では、ヘッダー以外のメタデータはありません。
なので、一部を隠ぺいしたいなどがあるのなら、外部公開用のヘッダーを作成してそれを提供します。

お仕事で別の会社さんからDLLを提供されることは、よくあることの一つですがほとんどというか
例外なく、外部提供用の専用ヘッダーを用意していただいていますよ。

DLLを見るとヘッダーに定義されていないエクスポート関数とかいっぱいありますから。

それがどうしても嫌だというのなら、C++/CLIにするとか、COMにするとかメタデータを
DLL内部に埋め込める別の形式を模索することになると思います。

DLLを提供される側の都合もあるので、現実的な線がどこにあるのかについては分かりかねますけど。

引用返信 編集キー/
■73973 / inTopicNo.9)  Re[5]: DLLにheadファイル?
□投稿者/ 紅葉の季節 (3回)-(2014/11/18(Tue) 19:23:36)
皆さん ご指導いただき有難うございます。

> DLLを見るとヘッダーに定義されていないエクスポート関数とかいっぱいありますから。

DLLの中身が見られますか。
例えば、中に含まれているクラス名やらメンバー関数など。
どうやって見ることができるのでしょうか。

またどうぞ宜しくお願い致します。

引用返信 編集キー/
■73975 / inTopicNo.10)  Re[6]: DLLにheadファイル?
□投稿者/ 魔界の仮面弁士 (175回)-(2014/11/18(Tue) 19:46:05)
No73973 (紅葉の季節 さん) に返信
> DLLの中身が見られますか。
どの種類の DLL なのかによっても代わりますが、naitive DLL で
公開されている関数の一覧を調べるのであれば、
  [Depency Walker]
  http://go.microsoft.com/fwlink/p/?LinkId=132640
が使えるかと思います。


> 例えば、中に含まれているクラス名やらメンバー関数など。
メタデータに型情報を含むタイプの DLL なら、そのメタデータを参照すればよし。
それが無いタイプの DLL なら、別ファイル(*.lib とか)で定義を確認することになるかと。
引用返信 編集キー/
■73976 / inTopicNo.11)  Re[7]: DLLにheadファイル?
□投稿者/ とっちゃん (277回)-(2014/11/18(Tue) 21:11:47)
とっちゃん さんの Web サイト
No73975 (魔界の仮面弁士 さん) に返信
> ■No73973 (紅葉の季節 さん) に返信
>
>>例えば、中に含まれているクラス名やらメンバー関数など。
> メタデータに型情報を含むタイプの DLL なら、そのメタデータを参照すればよし。
> それが無いタイプの DLL なら、別ファイル(*.lib とか)で定義を確認することになるかと。

エクスポート(外部公開)情報は、ほかにも dumpbin でも見れます。
どちらも、PEヘッダーをみて、どういう関数が公開されているかなどを表示します。

ただし、これらは、クラスの全容がわかるわけではありません。
プライベートメンバーなどは外部アクセスしないので、リンクデータとして不要なため含まれていません。

そのほかで、クラスの全容を持っているのは、デバッグ情報くらいです(.pdbファイル)かね。
こちらは、通常外部提供しないので、利用者側にとっては参照可能情報というわけではありませんが
一応これを読めばわかるようにはなっています。




引用返信 編集キー/
■73979 / inTopicNo.12)  Re[8]: DLLにheadファイル?
□投稿者/ 紅葉の季節 (4回)-(2014/11/19(Wed) 14:07:03)

皆さん、貴重な情報とご指導ありがとうございました!
本当に勉強になりました。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -