マネージコードからアンマネージコード呼び出し – プログラミング – Home

マネージコードからアンマネージコード呼...
 
通知
すべてクリア

[解決済] マネージコードからアンマネージコード呼び出し


パクチー
 パクチー
(@パクチー)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

環境は以下の通りです。
OS:WindowsXP
開発:VisualStudio2005 SP1
言語:C++

●やりたいこと
開発中のDLL(CLRあり、マネージコード)から、提供されたライブラリ
(CLRなし、アンマネージコード)を呼び出したい。

構造は以下のようなです。
DLL(開発中)から関数Hoge()をコール

関数Hoge()は、提供されたアンマネージのライブラリ(C++で実装)の機能を
使って実装しました。
関数Hoge()をスタティックライブラリとして作成しています。

●問題
DLLからスタティックライブラリをリンクしてコンパイルするところで
error LNK2001: 外部シンボル "Hoge() (Hoge) は未解決です。
と表示されます。
周りの人にも聞いてみたのですが、マネージからアンマネージを呼ぶには
アンマネージの方をCOM化する必要があるのでは?とのことでした。

質問は以下の通りです。
1、マネージからアンマネージを呼ぶときの作法を教えてください。

2、アンマネージの方、今回ですとHoge()をCOM化する必要があるのでした
サンプルとなるようなコードや情報があるところを教えてください。

回答よろしくお願い致します。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

...どってことなく呼べますょ?

http://codezine.jp/a/article/aid/1382.aspx


返信引用
パクチー
 パクチー
(@パクチー)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

επιστημηさん、レスありがとうございます。

CLIでラッピングして、アンマネージを呼び出してやれば良いってことですね。

ご紹介いただいたサイトを参考に試してみます。
ありがとうございました。


返信引用
パクチー
 パクチー
(@パクチー)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

こんばんわ

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の参照以外に何か設定が必要なのでしょうか?

よろしくお願い致します。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

.NETアセンブリをスタティックリンクするなんて聞いたことないんですケド。

> DLLがスタティックライブラリに変わっただけで、そんなに違いはないと思うのです
が、

.NETの場合大違いじゃないですか?
DLL内に生成されたメタデータを頼りに参照を解決するんだから。


返信引用
パクチー
 パクチー
(@パクチー)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

επιστημηさん、レスありがとうございます。

私は元々UNIX系の技術者です。
C#での開発経験はありますが、今回VC++は初めてです。

私が.Netのこと良く分かってないせいだと思いますが
一般論として
StaticLink コンパイル時にリンクされる。
DynamicLink 実行時にリンクされる。
と認識しています。

>.NETの場合大違いじゃないですか?
>DLL内に生成されたメタデータを頼りに参照を解決するんだから。
では、.Netの場合、スタティックライブラリをリンクする場合には
何を頼りに参照を解決するのでしょうか?
私は、LIBファイル内にあると思っていたのですが、
それで、Pragmaでスタティックリンクライブラリを指定して
コンパイルすれば、参照が解決できるのかと....

根本的に勘違いしているでしょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> では、.Netの場合、スタティックライブラリをリンクする場合には
> 何を頼りに参照を解決するのでしょうか?

.Netのスタティックライブラリって見たことあります?
お客さんは.Netわかっててそんなこと言ってます?


返信引用
パクチー
 パクチー
(@パクチー)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

おはようございます。

>.Netのスタティックライブラリって見たことあります?
いえ、ないです。
アンマネージのスタティックリンクライブラリならあります。

>.NETアセンブリをスタティックリンクするなんて聞いたことないんですケド。
ひょっとして、.Netのアセンブリって、DLLかEXEしかないってことでしょうか?
プロジェクトの設定で、CLRありにして、出力をEXE、DLL、スタティックライブラリ
を選べるので、てっきり.NETでもスタティックライブラリが
作れると思っていたのですが


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

作れるけどその場合Nativeなライブラリとしてしか機能しないんちゃいます?


返信引用
パクチー
 パクチー
(@パクチー)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

こんにちわ、回答ありがとうございます。

>作れるけどその場合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から使えるようにするということでよろしいでしょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> なので、アンマネージのスタティックライブラリをマネージ(CLI)のDLLで
> ラッピングして、APから使えるようにするということでよろしいでしょうか?

いいけど、↓どーします?

 今回は、お客さんの要求の都合でラッパクラスをスタティックライブラリ
 にする必要があるのです。


返信引用
パクチー
 パクチー
(@パクチー)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

こんにちわ

>今回は、お客さんの要求の都合でラッパクラスをスタティックライブラリ
>にする必要があるのです。
あっ、すいません。どうも書き方が悪かったようです。
お客さんの要求は、全ての機能を1つのDLLで提供して欲しいという
ことでした。

なので、最初勘違いしていて
メインのマネージドDLL(機能1、機能2のスタティックライブラリをリンク)
機能1のスタティックライブラリ(CLIのラッパクラス)
機能2のスタティックライブラリ(CLIのラッパクラス)
という構成でメインのDLLをビルドして、これだけを提供するつもりでした。

修正してCLRのラッパクラスをDLLにするか、メインのDLLの中に組み込む
かになると思います。
お客さんの要望は1つのDLL提供なので、現在ラッパクラスをメインDLL
の方へ組み込もうとしているところです。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

了解。そんじゃ問題なさげ。
ともあれちっちゃなお試しこさえるが吉っしょ。


返信引用
パクチー
 パクチー
(@パクチー)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

こんにちわ

>了解。そんじゃ問題なさげ。
>ともあれちっちゃなお試しこさえるが吉っしょ。

はい。
επιστημηさんのサンプルで基本的なところは問題ないことが
わかったので、本番に近い構成でお試しのプログラムを
書いているところです。
ありがとうございました。


返信引用
パクチー
 パクチー
(@パクチー)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

επιστημηさんの記事
http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_02.html

を元にCLIでラッパクラスを作ることで対処が出来ました。
大変助かりました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました