管理人個人メモ/DLL/DLL2/copy

Last-modified: 2011-09-03 (土) 15:45:10

はち 2005/09/04(日) 18:45:58

こんにちは。
本日、C#で作成したDLLをC++できちんと動作するように、指示があったのですが、C+
+は初めてでよくわかりません。
C#ができるからと考えていた私が甘かった・・・。
やりたいことは、C#で作成したクラスライブラリをC++で実行したい。
ということです。

呼び出し側の情報
クラス名:Execute
メソッド名:ConeectDb
引数:string conStr ->第一引数
  :string conPw ->第二引数
戻り値:正常:0 異常:-1

以上をC++側で実行したいだけなのですが・・・。
C++側はボタンを押下するフォームのみ作成はできたのですが、
LoadLibraryなどの使い方をみても良く判らなくて・・・
すみませんが、助けてください ><


επιστημη 2005/09/04(日) 19:02:56

C#で作成したDLLってことはアセンブリなのよね。
これをC++から呼ぶってことはManaged C++(C++/CLI)だわね。
とすると、普通のC++とはワケが違います。

てゆっか、わざわざC++で呼ぶくらいなら、全部C#でやれば? って思う。

.NETの規約に従って呼び出すことになりますから、
それに応じた参考書を読むべし。

上に挙げられた質問"だけ"に答えるのなら楽ですが、
あなたの求めるものはそんなんじゃありませんよね?


まきじ 2005/09/04(日) 19:07:42

マルチポストは駄目ですよ。

http://www.mtakahashi.com/cgi.cgi?13565


はち 2005/09/04(日) 19:39:27

すみません、ちょっと切羽つまっていたので、多重投稿になりました。
普通のC++じゃないんですね・・・。(といってもC++が初めてですが。)
ほんとう、C#でつくって、なぜわざわざC++で動くか確認するのかは、私も不明です。

もうしわけありません、もうしばらく考えて見ます・・・


とおり 2005/09/04(日) 21:34:23

マルチポストした全ての箇所に、↑の回答を書いて閉じて下さい。


επιστημη 2005/09/04(日) 22:34:23

  • Execute.cs ---
    public class Execute {
 public int ConnectDB(string conStr, string conPw) {
   System.Console.WriteLine("conStr={0}, conPw={1}", conStr, conPw);
   return conStr.Length == conPw.Length ? 0 : -1;
 }

}

  • cppmain.cpp --- #include(): Usage: (a-page-name-you-want-to-include[,title|,notitle])

#using

#include(): Usage: (a-page-name-you-want-to-include[,title|,notitle])

using namespace System;

int _tmain() {

   Execute __gc* p =  __gc new Execute();
   int result = p->ConnectDB(S"Hello", S"World");
   std::cout << "result = " << result << std::endl;
   return 0;

}

  • コマンドライン ---
    csc /t:library execute.cs
    cl /clr:oldSyntax /FU Execute.dll cppmain.cpp

…とりあえず、これで呼べてます。


επιστημη 2005/09/04(日) 23:27:00

自己ふぉろー。
近頃の書き方だとこぉなります。

#using

#include(): Usage: (a-page-name-you-want-to-include[,title|,notitle])

using namespace System;

int main() {

   Execute^ p =  gcnew Execute();
   int result = p->ConnectDB("日本", "ちゃちゃちゃ");
   std::cout << "result = " << result << std::endl;
   return 0;

}

コマンドラインは:
cl /clr /FU Execute.dll cppmain.cpp


Blue 2005/09/06(火) 12:45:25

COM化しても出来るそうです。

タイムリー(なのか)に他の掲示板で同じ話題が出ていたのでリンクを張っておきます。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24189&forum=7&1
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24181&forum=7&1
(おそらく折曲がるのでアドレスバーにコピペしてください)


シャノン 2005/09/07(水) 18:29:47

「逆P/Invoke」っつー手法を使って、マネージドアセンブリからアンマネージメソッド
をエクスポートすることもできます。
激しく面倒くさいですが。


古いスレッドには追加発言できません。