C#でつくったDLLを呼び出したい

[戻る]
はち 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 <tchar.h>

#using <mscorlib.dll>
#include <iostream>

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 <mscorlib.dll>
#include <iostream>

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」っつー手法を使って、マネージドアセンブリからアンマネージメソッド
をエクスポートすることもできます。
激しく面倒くさいですが。

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