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