環境は以下の通りです。
OS:WindowsXP
開発:VisualStudio2005 SP1
言語:C++
●やりたいこと
開発中のDLL(CLRあり、マネージコード)から、提供されたライブラリ
(CLRなし、アンマネージコード)を呼び出したい。
構造は以下のようなです。
DLL(開発中)から関数Hoge()をコール
関数Hoge()は、提供されたアンマネージのライブラリ(C++で実装)の機能を
使って実装しました。
関数Hoge()をスタティックライブラリとして作成しています。
●問題
DLLからスタティックライブラリをリンクしてコンパイルするところで
error LNK2001: 外部シンボル "Hoge() (Hoge) は未解決です。
と表示されます。
周りの人にも聞いてみたのですが、マネージからアンマネージを呼ぶには
アンマネージの方をCOM化する必要があるのでは?とのことでした。
質問は以下の通りです。
1、マネージからアンマネージを呼ぶときの作法を教えてください。
2、アンマネージの方、今回ですとHoge()をCOM化する必要があるのでした
サンプルとなるようなコードや情報があるところを教えてください。
回答よろしくお願い致します。
επιστημηさん、レスありがとうございます。
CLIでラッピングして、アンマネージを呼び出してやれば良いってことですね。
ご紹介いただいたサイトを参考に試してみます。
ありがとうございました。
こんばんわ
CLIで検索を行い、επιστημηさんの以下の記事を参考にしました。
http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_02.html
しかし、うまく行きません。
επιστημηさんの記事ですと、ラッパクラスをhellolib.dll
という形で作成して、hellouserという.Netアプリケーションから
利用していますね。
今回は、お客さんの要求の都合でラッパクラスをスタティックライブラリ
にする必要があるのです。
επιστημηさんの記事のようにDLLにすると問題ありませんが、
スタティックライブラリにするとリンク時に
xxxx.obj : error LNK2020: 未解決のトークン (06000001)
lap_test::lap_hoge
と表示されます。
ラッパのlap_test::lap_hoge()の中で、アンマネージの関数:hogeをコールしていま
す。
Pragmaでスタティックライブラリの設定していますし、問題ないと思うのですが?
ちなみにεπιστημηさんのサンプルhello.zipを少し改造して
hellolibをDLLからスタティックライブラリに変更して
マネージコードからhellolib.libを使うようにしてみたのですが
1>hellouser_CP.obj : error LNK2020: 未解決のトークン (06000001)
HelloLib::Execute
と同じようなエラーとなります。
DLLがスタティックライブラリに変わっただけで、そんなに違いは
ないと思うのですが、PragmaでLIBの参照以外に何か設定が必要なのでしょうか?
よろしくお願い致します。
.NETアセンブリをスタティックリンクするなんて聞いたことないんですケド。
> DLLがスタティックライブラリに変わっただけで、そんなに違いはないと思うのです
が、
.NETの場合大違いじゃないですか?
DLL内に生成されたメタデータを頼りに参照を解決するんだから。
επιστημηさん、レスありがとうございます。
私は元々UNIX系の技術者です。
C#での開発経験はありますが、今回VC++は初めてです。
私が.Netのこと良く分かってないせいだと思いますが
一般論として
StaticLink コンパイル時にリンクされる。
DynamicLink 実行時にリンクされる。
と認識しています。
>.NETの場合大違いじゃないですか?
>DLL内に生成されたメタデータを頼りに参照を解決するんだから。
では、.Netの場合、スタティックライブラリをリンクする場合には
何を頼りに参照を解決するのでしょうか?
私は、LIBファイル内にあると思っていたのですが、
それで、Pragmaでスタティックリンクライブラリを指定して
コンパイルすれば、参照が解決できるのかと....
根本的に勘違いしているでしょうか?
> では、.Netの場合、スタティックライブラリをリンクする場合には
> 何を頼りに参照を解決するのでしょうか?
.Netのスタティックライブラリって見たことあります?
お客さんは.Netわかっててそんなこと言ってます?
おはようございます。
>.Netのスタティックライブラリって見たことあります?
いえ、ないです。
アンマネージのスタティックリンクライブラリならあります。
>.NETアセンブリをスタティックリンクするなんて聞いたことないんですケド。
ひょっとして、.Netのアセンブリって、DLLかEXEしかないってことでしょうか?
プロジェクトの設定で、CLRありにして、出力をEXE、DLL、スタティックライブラリ
を選べるので、てっきり.NETでもスタティックライブラリが
作れると思っていたのですが
作れるけどその場合Nativeなライブラリとしてしか機能しないんちゃいます?
こんにちわ、回答ありがとうございます。
>作れるけどその場合Nativeなライブラリとしてしか機能しないんちゃいます?
なるほど
.NETのことを良くわかっておらず、的外れな質問をしていたようで
申し訳ありません。
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA_
(.NET)
アセンブリはプロセスアセンブリ (EXE)とライブラリアセンブリ (DLL)の
2種類のみのようですね。
なので、アンマネージのスタティックライブラリをマネージ(CLI)のDLLで
ラッピングして、APから使えるようにするということでよろしいでしょうか?
> なので、アンマネージのスタティックライブラリをマネージ(CLI)のDLLで
> ラッピングして、APから使えるようにするということでよろしいでしょうか?
いいけど、↓どーします?
今回は、お客さんの要求の都合でラッパクラスをスタティックライブラリ
にする必要があるのです。
こんにちわ
>今回は、お客さんの要求の都合でラッパクラスをスタティックライブラリ
>にする必要があるのです。
あっ、すいません。どうも書き方が悪かったようです。
お客さんの要求は、全ての機能を1つのDLLで提供して欲しいという
ことでした。
なので、最初勘違いしていて
メインのマネージドDLL(機能1、機能2のスタティックライブラリをリンク)
機能1のスタティックライブラリ(CLIのラッパクラス)
機能2のスタティックライブラリ(CLIのラッパクラス)
という構成でメインのDLLをビルドして、これだけを提供するつもりでした。
修正してCLRのラッパクラスをDLLにするか、メインのDLLの中に組み込む
かになると思います。
お客さんの要望は1つのDLL提供なので、現在ラッパクラスをメインDLL
の方へ組み込もうとしているところです。
了解。そんじゃ問題なさげ。
ともあれちっちゃなお試しこさえるが吉っしょ。
こんにちわ
>了解。そんじゃ問題なさげ。
>ともあれちっちゃなお試しこさえるが吉っしょ。
はい。
επιστημηさんのサンプルで基本的なところは問題ないことが
わかったので、本番に近い構成でお試しのプログラムを
書いているところです。
ありがとうございました。
επιστημηさんの記事
http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_02.html
を元にCLIでラッパクラスを作ることで対処が出来ました。
大変助かりました。
ありがとうございました。