こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

マネージドDLLをC++からLoadLibrary

プログラムの環境設定、実装についての質問になります。

(1)VS2013 C#で作成したDLL を 
(2)MFCプロジェクトからLoadLibrary関数を使い呼び出す方法があれば教えてくれませんか?

(1)にCOMとして参照する設定を行い、COMとして扱うのでしたら
ネットでいくつか方法がありましたが、今回はDynamicLinkLibraryとして扱いたいです。

この場合、C++/CLIを用いる事になるのでしょうか。。

全く予想つかなく悩んでおります。何か参考となるURLなどでも構いません。

何卒宜しくお願いします。

投稿日時 - 2015-07-13 17:12:54

QNo.9011617

すぐに回答ほしいです

質問者が選んだベストアンサー

C++/CLIは参考になるサイトは少ないですね…。
特にC++/CLIを使うケースって、マネージアプリ→ネイティブDLLが主だと思うので、逆は見た覚えがありません。
私の場合は、主にMSDNと睨めっこしながら、小さなコード片で実験して、解らない所は個別にググり…という感じで覚えました。

ただまぁ、C++とC#が使いこなせていれば、C++/CLIはそんなややこしいものでもありません。
以下、C++/CLIでマネージクラスを定義せずC#のコードを呼び出すだけなら、このあたりを抑えておけば使えるだろうと思うものを上げておきます。

・C++/CLI側でマネージ型オブジェクトの生成はgcnewというキーワードを使う
・gcnewやC#側で生成された.NETランタイムのマネージヒープ上に確保されたオブジェクトは、ガベコレの関係で特殊な扱いが必要になる
・マネージヒープ上のポインタに相当する「ハンドル(Object^)」という型がある
・マネージヒープ上のオブジェクトは普通の参照渡し(Object&)が使えず、代わりに「追跡参照(Object%)」というものを使う
・マネージ型←→アンマネージ型の型変換(マーシャリングといいます)をサポートするヘルパー関数が用意されている(marshal_as、marshal_context、msclr\marshal.hで定義されています)
・マネージ側のバイト列やオブジェクトを、アンマネージの関数にポインタとして渡す必要がある場合はpin_ptrというものを使う
・マネージ配列(.NETの配列型)はarray<type>^という型で、gcnewを確保する
・.NETの値型(C#でstructで定義する型)は、C++でも値型として変数を定義でき、実際にスタック上に確保される。

(注:私がC++/CLI使ったのが2,3年くらい前で、使い込んだという程使っていたわけでもないのでややうろ覚えです。間違いが含まれていたら申し訳ありません)

このあたりを足がかりにしてみてください。
あまりお力になれていない回答ですが、少しでも参考になれば。


※参考URL
・C++プログラマのためのC++/CLI入門
http://ambiesoft.fam.cx/cppcli/cli:%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB
説明は簡素ですが、C++/CLI特有の概念や機能を大まかに把握するには丁度いいサイトだと思います。

・C++/CLI 移行ガイド(MSDN)
https://msdn.microsoft.com/ja-jp/library/ms235289.aspx
突っ込んだ事を知るには本家に当たるのがベストです。

・C++/CLI言語仕様書の非公式和訳
http://vene.wankuma.com/ecma372/StartingState.aspx
MSDNは、文法などを確認したいとき、どこにあるのか良くわからない事が多いので、補助的に見てました。

投稿日時 - 2015-07-15 20:39:04

お礼

ご連絡ありがとうございます。
非常に分かりやすい内容で助かりました。

>特にC++/CLIを使うケースって、マネージアプリ→ネイティブDLLが主だと思うので、
>逆は見た覚えがありません。

本当にそうですね。逆パターンは海外の質問サイトでもほとんど記述しておらず、
非常に困ってました。通常はC#への移行目的ですから仕方ないですね。。


C++/CLIの基本と参考URLに関してもありがとうございます。
こちらは直ぐに理解するのは難しいのでゆっくりと勉強していこうと思います。

投稿日時 - 2015-07-17 09:16:17

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(2)

ANo.1

LoadLibary関数はネイティブDLLをロードする関数なのでマネージDLLは扱えません
ネイティブコードからマネージDLLを呼び出す方法は、COMとして扱うか、C++/CLIを経由するしか方法はありません

投稿日時 - 2015-07-14 00:56:16

お礼

ありがとうございます。

やはりそうですか、、C++/CLIを使う方法で参考になるサイトなどありましたらお教え頂けないでしょうか?

投稿日時 - 2015-07-14 09:04:53

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-