C#でDLLのメソッド作り方と戻り値の送り方
- C#のDLLの作り方とメソッドの戻り値の送り方について説明します。
- MEFを使ってC#のプログラムを作成していますが、DLLにwebBrowser1などのメインにある変数を渡すことはできません。
- DLL側のメソッドは戻り値を返すことはできますが、メインにある変数を直接使うことはできません。他の方法を考える必要があります。
- ベストアンサー
C#でのDLLのメソッドの作り方
MEFを使ってC#のプログラムを作っています。 DLL側のメソッドとして public bool ブーリアン(){ return true; } public string ストリングス(){ return "文字列"; } のような、戻り値をDLLからメインに送ることはできるのですが、 public void ナビ(int a){ webBrowser1.Navigate(http・・・・); Thread.Sleep(a); webBrowser1.Navigate(http・・・・); Thread.Sleep(a); }//webBrowser1はメインにある このような処理をDLLに入れようとすると、当たり前ですが「webBrowser1」なんてないぞ っと怒られてしまいます。 どのように渡せばよいのでしょうか?
- satisfied999
- お礼率34% (214/620)
- C・C++・C#
- 回答数3
- ありがとう数13
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>型または名前空間名 'webBrowser' が見つかりませんでした。 webBrowserではなくWebBrowserでしたかね。 大文字小文字は区別したかと。 http://msdn.microsoft.com/ja-jp/library/system.windows.controls.webbrowser%28v=vs.100%29.aspx
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
「using ディレクティブまたはアセンブリ参照が不足しています」 とエラーメッセージが出ているんだから, using ディレクティブをつかうなりアセンブリ参照を追加するなりすればいいのでは?
補足
説明不足で失礼しました。 using System.Windows.Controls; は追加しています。アセンブリ参照は何を追加していいのかよくわかりません、ご存じありませんか?
- Wr5
- ベストアンサー率53% (2177/4070)
>どのように渡せばよいのでしょうか? 引数で渡してください。 # クラスのフィールドにしてコンストラクタなりの引数で渡す。というのもありますが。 public void ナビ(webBrowser webBrowser1, int a){ webBrowser1.Navigate(http・・・・); Thread.Sleep(a); webBrowser1.Navigate(http・・・・); Thread.Sleep(a); } みたいな。
補足
それだと、DLLのなかに、webBrowser1 がないのでリビルドできなくなりませんか? とりあえず、コピペしましたが 型または名前空間名 'webBrowser' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 というエラーが検出されました。 インターフェイスに void ナビ(webBrowser webBrowser1, int a); を入れても同様のエラーが検出されます。
関連するQ&A
- C++におけるスレッド制御に関して
C++初心者です。 スレッド制御の勉強をしておりますが、 なかなかうまくいきません。 下記のソースのようにスレッド生成をしておりますが、 スレッド用メソッドには、*を付けて使用するしか方法はないのでしょうか? pthread_createに渡す第3パラメータをメソッド名のみにして、呼ばれ元のメソッドの戻り値をvoid* ではなく、void のみで実施したいと思っておりますが、方法がわかりません。 大変申し訳ございませんが、ご教授よろしくお願いいたします。 ############################################################## # pthread_test.cc ############################################################## #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h> /* * スレッドパラメータ格納用 */ typedef struct { char printVal; int interval; } ThreadParamT; // スレッドイニシャル関数 void *ThreadTest(void *arg) { ThreadParamT *thread_test_param =(ThreadParamT*)arg; while(1) { fprintf(stderr,"%c", thread_test_param->printVal); sleep(thread_test_param->interval); } return NULL; } int main(int argc,char *argv[]) { int status; // スレッドのパラメータ pthread_t thread_test; ThreadParamT thread_test_param; thread_test_param.printVal = 'a'; thread_test_param.interval = 1; // スレッドを生成 status=pthread_create(&thread_test, NULL, ThreadTest, &thread_test_param); if(status!=0){ fprintf(stderr,"ERR! OUT!\n"); exit(1); } // 10s間待つ sleep(10); fprintf(stderr, "\n"); return 0; } ##############################################################
- 締切済み
- C・C++・C#
- メソッドの強制脱出について
質問させてください。 メソッドで長い処理をしている場合、その途中である条件のときに、その先の処理をしないでメソッドを終了させる良い方法ってありますか? ループ中ではないので"break""continue"は使用できないので困っています。 ちなみに戻り値も"void"なので"return"も使用できません。 複数処理が考えられるのであれば、いろいろ教えていただきたいと思います。 詳しい方がいらしましたら教えてください。
- 締切済み
- Java
- C# こういう場合ってどうなるの?
public void A(bool b) { if(b ? B() : C())//分かると思いますが、三項演算子 { //略 } } public bool B() { return true; } public bool C() { return false } 上記のAにtrueを渡し実行した場合、 if文の中はどうなるのでしょうか? 引数がtrueならBを実行し、Bの戻り値trueが if文で処理され、if内に入る・・・でよろしいのでしょうか? それとも引数bの評価がそのままifで使われるのでしょうか? 例えばのコードなので、bだろうがBだろうが変わらない・・・みたいな 回答はご遠慮ください。
- 締切済み
- C・C++・C#
- メインメソッド無しでJavaを実行する方法
Javaにメインメソッドってあるじゃん。public static void main(string[] args){;}でお馴染みのアレです。 Javaを実行するには、javaコマンドの引数に.classファイルのファイル名を指定するよね。んで、その.classファイルにメインメソッドを含んでいる必要があって、Javaを実行するにはメインメソッドが必須だそうです。このように、参考書やWEBなどあちこちに書いてあります。 しかし、メインメソッド必須というのは、厳密には間違いなんだそうです。メインメソッドが無くてもJavaを動かす裏ワザがあると、↓のブログに書いてありました。(基本はメインメソッドだとは思うのですが) http://blogs.wankuma.com/kacchan6/archive/2007/07/24/86663.aspx ここにプログラムがザックリ書いてあったのですが、本当に動くんですか? public class MimeticMain{ static boolean init = caller(); public static boolean caller(){ System.out.println("main()が無くても動く"); return true; } } -- これを動かすと、「main()が無くても動く」と表示するんですかね。私がやると、エラーになっちゃったのですが。 エラー: メイン・メソッドがクラスMimeticMainで見つかりません。次のようにメイン・メソッドを定義してください。 public static void main(String[] args) ーー あと、staticイニシャライザーを使うと、メインメソッドが無くても動くと、冒頭に書いてあります。自分なりに調べて書いてみたんですが、エラーですね。 public class MimeticMain{ public static void mMain(){System.out.println("main()が無くても動く");} static{mMain();} } メインメソッドが無くても動くって、本当?そのコードを書けますか?10行50ワード以下の簡単なプログラムで良いと思いますが。 2007年のブログらしく、当時の古いバージョンのJavaならば動くのかしら?Javaも仕様がどんどん変わっていて、バージョンアップするとメインメソッド必須になったのかしら?
- ベストアンサー
- Java
- 匿名メソッドの動作が分かりません
C#2.0のサンプルで以下のようなコードがあるのですが 分からない箇所は、goToメソッドのところなのですが、returnの返り値がなく引数のない匿名メソッドをgoToメソッドの引数にしているのです、匿名メソッドの中でreturnの返り値がないならgoToメソッドの引数にはならないのではないでしょうか?動作が分かりません。 public static void WarpTo(Place distPlace) { goTo(distPlace, delegate() { }, delegate() { }); } public static void GoTo(Place distPlace) { // 他人の目がある移動か? bool hasOtherEyes = currentPlace.HasOtherEyes || distPlace.HasOtherEyes; goTo(distPlace, delegate() // 匿名メソッド { //処理(1) }, delegate() // 匿名メソッド { //処理(2) } ); } このサンプルは一部抜粋で全文は@ITから、 http://www.atmarkit.co.jp/fdotnet/csharp20/csharp20_01/csharp20_01_02.html
- ベストアンサー
- C・C++・C#
- メソッドの再帰呼び出しについて
再帰処理に関する質問をさせていただきます。私は今複数のarraylistの中に入っているオブジェクトを順列を用いてすべての並びを所得するプログラムを作っています。プログラムが長く汚いので(汗)、例で示させていただきます。 (例) ArrayList t1; ArrayList t2; t1の中身[obj1,obj2] t2の中身[obj3,obj4] 結果:以下のように4つオブジェクトを作成 [obj1,obj3],[obj1,obj4],[obj2,obj3],[obj2,obj4] それに伴い、メソッドを作り再帰呼び出しを行っているんですが、returnでメインに返りません。戻り値はvoidです。また、 return; System.out.println("check"); と書くと、checkが出力されてしまっています(しかも何個も)。IndexOutOfBoundsExceptionのエラーがでるのですが、先にreturnを処理するはずなのになぜだろうと悩んでいます。 return以外にメインに戻る方法はあるんでしょうか?またreturnでメインに戻らない理由を知っている方がいるなら、ぜひ教えていただきたいです。よろしくお願いします。
- 締切済み
- Java
- c# スレッド間でのデータの共有
C#でメインプロセスと生成されたスレッド間でデータの共有をさせたいのですがどのようにすればいいのでしょうか。ご教授お願い致します。 ・メインプロセス(A) ・Aから生成されたスレッド(B) 例えば、AとBで変数の値をそれぞれ読み書きさせたい場合 どのようにすればよいのでしょうか。 class TEST { public int flag; // メインプロセス(A) public static void Main() { Thread t = new Thread(new ThreadStart(abc)); t.IsBackground = true; t.Start(); while(ture) { Thread.Sleep(10); Console.WriteLine("A:{0}",flag); } } // Aから生成されたスレッド(B) public void abc() { Console.WriteLine("B:{0}",flag); flag++; } }
- ベストアンサー
- C・C++・C#
- C#のインスタンスを参照渡ししたい
メインのクラスAにウェブブラウザAがあります。 クラス A { メソッドA(){ ウェブブラウザA.Navigate(URL); } メソッドC(){ MessageBox.Show("これは成功"); } } クラス B { メソッドB(ウェブブラウザA){ ウェブブラウザA.Navigate(URL);//成功 } A a = new A(); a.メソッドA();//失敗 a.メソッドC();//成功 } このようなプログラムを作っています。 クラスBをインスタンスして実行すると クラスBのメソッドBは成功しますが、クラスAの方で宣言しているa.メソッドAは失敗します しかし、a.メソッドC();は成功します。 これは、a.メソッドAは、その上のA a = new A();でつくられた新しいインスタンスのなかで処理がされていて起動時につくられたクラスAのインスタンスとは別のものになっているからだと思うのですが、まちがいないでしょうか? この処理を成功させたい場合、起動時に作られたクラスAのインスタンスをメソッドBの引数に参照渡しですれば、 メソッドB(ウェブブラウザA){ ウェブブラウザA.Navigate(URL);//成功 メソッドA(); } も可能なのではないかと考えているのですが、可能でしょうか?またそのインスタンスを引数にする方法はどのようなものでしょうか? ちなみに、クラスBはDLLに置いてあり、メソッドAは複数のDLLで使うので毎度書くのは面倒なのでクラスAの中で呼び出して使いたいと考えています。
- ベストアンサー
- C・C++・C#
- メソッド制御に関して
C++初心者です。 メソッドのタスク制御??を行いたいのですが、 いまいちよくわかりません。 やりたいことは、下記のソース(検討違いかと思いますが..)のように、 メソッドをリストにして、ループで処理をさせたいというものです。 下記を説明致しますと、TestFunc1()・TestFunc2()というメソッドがあります これらのメソッドをリスト化(programList)して、 メソッド呼び出し元(main)にて、ループをさせてメソッドコールをするというものです。 下記ソースもかなり見当違いであると思われますが、 大変申し訳ございませんが、ご教授よろしくお願いいたします。 ########################################################### # task_Test.cc ########################################################### #include <stdio.h> #include <stdlib.h> #include <unistd.h> // 起動プログラム数 #define PROGRAM_NUM (2) // 呼ばれ元メソッド1 int TestFunc1() { // 戻り値 int ret = 0; printf("TestFunc1 Start!\n"); return ret; } // 呼ばれ元メソッド2 int TestFunc2() { // 戻り値 int ret = 0; printf("TestFunc2 Start!\n"); return ret; } // 起動プログラムリスト (void*) programList[PROGRAM_NUM]={TestFunc1(),TestFunc2()} int main(int argc,char *argv[]) { // ループカウンタ int iCnt; // ループ処理 for (iCnt=0; iCnt<PROGRAM_NUM; iCnt++) { programList[iCnt]; } return 0; } ###########################################################
- ベストアンサー
- C・C++・C#
- VisualStudio2005でのDLL作成
開発環境 OS:WindowsXP SP2 SDK:VisualStudio2005 StandardEdition 言語:VC++ Win32コンソールアプリケーションのDLLを選択 空のプロジェクトを使用 作成したいのはVBなどから呼び出せるWin32DLLです。 他のホームページを参考にして以下のようなファイルを作成し ビルド->コンパイルしたところdllファイルはできましたが AccessVBAから参照設定ができませんでした。 どこを修正すればよいか教えてください。 <dlltest.cpp> #define EX __declspec (dllexport) #include <iostream> #include <windows.h> EX int fnWindowHook(void); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call){ case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } EX int hundred(){ return 100; } <dlltest.def> LIBRARY "dlltest1" EXPORTS disp @1
- ベストアンサー
- C・C++・C#
補足
なんとか、DLL側に↓のようなメソッドを作ることができました public void ナビ(webBrowser webBrowser1){ webBrowser1.Navigate(http・・・・); } ありがとうございます。 しかし、メイン側からこのメソッドに引数でブラウザを送る方法がわかりません。 ナビ(System.Windows.Forms.WebBrowser Form1.webBrowser1); のような形ではないかと思うのですが、どうにも入っていってくれません。 Form側で作っているwebBrowser1はどのようにDLLの引数に送ればよいでしょうか?