• ベストアンサー

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

プログラムの環境設定、実装についての質問になります。 (1)VS2013 C#で作成したDLL を  (2)MFCプロジェクトからLoadLibrary関数を使い呼び出す方法があれば教えてくれませんか? (1)にCOMとして参照する設定を行い、COMとして扱うのでしたら ネットでいくつか方法がありましたが、今回はDynamicLinkLibraryとして扱いたいです。 この場合、C++/CLIを用いる事になるのでしょうか。。 全く予想つかなく悩んでおります。何か参考となるURLなどでも構いません。 何卒宜しくお願いします。

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

  • ベストアンサー
  • axsies
  • ベストアンサー率64% (38/59)
回答No.2

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は、文法などを確認したいとき、どこにあるのか良くわからない事が多いので、補助的に見てました。

mindeyed
質問者

お礼

ご連絡ありがとうございます。 非常に分かりやすい内容で助かりました。 >特にC++/CLIを使うケースって、マネージアプリ→ネイティブDLLが主だと思うので、 >逆は見た覚えがありません。 本当にそうですね。逆パターンは海外の質問サイトでもほとんど記述しておらず、 非常に困ってました。通常はC#への移行目的ですから仕方ないですね。。 C++/CLIの基本と参考URLに関してもありがとうございます。 こちらは直ぐに理解するのは難しいのでゆっくりと勉強していこうと思います。

その他の回答 (1)

  • axsies
  • ベストアンサー率64% (38/59)
回答No.1

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

mindeyed
質問者

お礼

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

関連するQ&A

  • C++/CLIのDLLをC#で使う

    C++/CLIのDLLをC#で使う ソリューションの中にC++/CLIでクラスを作成し、出力がDLLのプロジェクトと、 C#でGUI画面の処理のプロジェクトがあります。 このときC#側でC++/CLI側で作ったDLLを使用したいのですが、やり方がわかりません。 DLL自体はC#のDebugフォルダに入っており、参照設定で読み込んでいます。 ご教授のほど、よろしくお願いいたします。

  • 【C#】マネージドDLLによる負荷

    1.C#で作成したマネージドDLLを参照し、ImportしてDLL内のクラスを使う方法 2.DLLにせず、直接ソースを取り込んでひとつのexeファイルとしてしまう方法 1と2ではパフォーマンス的にどちらが有利とかあるでしょうか。 アンマネージドDLLの場合、静的リンクや動的リンクなど、実装によって 多少のパフォーマンス差が出ることがありますが マネージドDLLでも何かパフォーマンス差が発生するのだろうかと ふと疑問に思い質問させていただきました。 私的にはJavaのjarファイルのような扱いと考えている(実行時には展開される)ので DLLにしたことによってパフォーマンス差はあまり出ないと考えているですが あっているでしょうか。 よろしくお願いいたします。

  • C# DLL(C++)の呼び出し

    自前のDLL(C++,DynamicLinkLibrary)を使っており 今回環境を変えようと試しているのですが、どうもエラーが発生し悩んでます。 (1)元々の環境 VS2008 MFCでLoasLibraryの呼び出し後、各関数も問題なく動作 (2)新しい環境 VS2013 C# DLLImport関数を使ったところ、エラー発生 改修内容 http://qiita.com/ask/items/ee2ff5b8706effc0c3d8 エラー内容 追加情報:hoge.DLL を読み込めません:指定されたモジュールが見つかりません。 (HRESULT からの例外:0x8007007E) お願いです。どなたか、ご教授頂けませんか? DLL側プロジェクト構成の設定変更が必要? DLL側ソースコードがおかしい? DLL側のVSバージョンが低い? 何が悪いか分かりません。

  • DLLが LoadLibrary() でロードされたか判断できますか

    VC++6.0でDLLを作成しています。 アプリケーションが自分のDLLを LoadLibrary()でロードしたのか、 LIBリンクでロードしたのか、判断はできるでしょうか。 DLLの処理の中で、LoadLibrary()でロードされた場合と LIBリンクでロードされた場合の処理を分けたいのが目的です。 (LIBリンクの場合、デタッチ時にはメインのスレッドしか動作しないため) <補足> 正式にはどう呼ばれているか解らないのですが、「LIBリンク」は VCの設定でリンクするLIBを指定し、アプリケーションでは DLLが提供する関数名を記述する方法を意味します。

  • LoadLibraryの戻り値(HMODULE)について

    ファイル名の異なる2つのDLLを下記のソースの様 にLoadLibraryしたところA,Bとも同じアドレスが 戻って来てしまいます。これではFreeLibraryにて 開放しようとした時に、おかしな事になってしまう と思うのですが、なぜ同じアドレスが戻ってくるのか 分りません。 あと、A,Bをグローバル変数として宣言 したときに、既に宣言済みですと怒られます。これも よく分りません。何方か理由が分る方ご教授願います。 void CXXX_Dlg::ButtonClick() { // dllファイルロード HMODULE A = ::LoadLibrary("A.DLL"); HMODULE B = ::LoadLibrary("B.DLL"); } 環境:Win2K, VC++.Net 2003 MFC です。 DLLファイルはプロジェクトと同ディレクトリに 入っています。

  • C++DLLの明示的リンクに関して

    DLLを明示的リンク(LoadLibraryとGetProcAddressを使用して)で使うとき、C言語では、関数名がそのまま利用できますが、C++では、オーバーロード機能があるため、関数名が変化してしまいます。C++でDLLを明示的リンクで使用するにはどうしたら良いのですか?

  • C++からC#のdllを参照する際、引数内に構造体があった場合の処理

    いつもお世話になっております。 http://satoshi.web5.jp/memo/connect_dll.htm VC++2008のMFCプロジェクトにて、C#のdllの関数を扱いたく、 上記サイトを参考に実装してみました。 上記サイトでも挙げているように、C#dll内の関数の引数が、 整数・文字列の場合は、うまく動作するのですが、 引数に構造体を渡し、dllにて構造体のデータを設定してやる関数にて、 引数の構造体ポインタを、どのように渡してやれば良いのかが 分かりません。 具体的には、 VARIANTARGの配列をnewし(変数pVarg)、 pVargに型と変数をセットして、Invoke関数に渡しますが、 その際の、pVargにセットしてやる型が分かりません。 このような場合は、どうすれば良いのでしょう? よろしくお願いします。

  • C++/CLIのDLLを、C#で参照した際の変数型

    現在、C++/CLIで作成したDLLを、C#で使おうとしています。 http://xptn.dtiblog.com/blog-entry-20.html 上記サイトを参考に、DLLを参照することはできたのですが、 C++/CLI側で「ulong」で定義した引数が、 C#で参照したとき「uint」に変わってしまっています。 【C++/CLI】  opensession(ULONG arg1, ULONG* arg2 ); 【C#】  opensession(UINT arg1, UINT* arg2); 調べてはいるのですが、 この原因がどうしてもわかりません。 ご教授のほど、よろしくお願いします。

  • CのEXEからC#のDLLを呼び出す

    C及びC#のPGは初心者ですが、宜しくお願いします。 現在、Cで作成したEXEからC#で作成したDLLを参照するとエラーが発生します。ただ、EXEとDLLを同じフォルダ内に配置すると正常に動作します。DLLを別のフォルダに配置するとエラーが発生します。 CがC#のDLLのPathが分からないからエラーが発生していると思っているのですが、Cのプロジェクトで何を設定したらいいのか、全然分かりません。 宜しくお願いします。

  • DirectX C++/CLIで作成したDLLをC#で使う

    DirectX C++/CLIで作成したDLLをC#で使う C++/CLIで記述したDirectXの処理を記述したDLLをC#で扱いたいのですが、 読み込みはでき、参照はできるのですが、DirectX特有のの型や構造体をC#側で使用できないでしょうか。 たとえばD3DXVECTOR3などです。  わかりにくい説明で恐縮ですが、ご教授の方よろしくお願いいたします。