C#でDLL内の関数へのthisの渡し方

このQ&Aのポイント
  • C#で、DLL内の関数へのthisの渡し方について説明します。例えば、Formアプリケーションでthisを引数として渡し、thisに格納されたWidthを表示するコードを書くことができます。
  • しかし、この方法でDLL側の関数を呼び出すと、'ClassLibrary1.Form1.Dispose(bool)'というエラーが発生する場合があります。これは、オーバーライドする適切なメソッドが見つからないためです。
  • このエラーの原因を特定するためには、引数の渡し方やオーバーライドメソッドの定義に問題がないか確認する必要があります。ご指導いただければ幸いです。
回答を見る
  • ベストアンサー

C#で、DLL内の関数へのthisの渡し方

例えば以下のように、thisを引数として渡して thisに格納されたWitdhを表示するコードを書いてみたのですが DLL側で以下のようなエラーが出てうまくいきません。 何か引数の渡し方などに問題があるのでしょうか?ご指導お願いします(>o<) ※エラー 'ClassLibrary1.Form1.Dispose(bool)': オーバーライドする適切なメソッドが見つかりませんでした。 ■フォームアプリケーションのコード private void Form1_Load(object sender, EventArgs e) {   System.Windows.Forms.Form This_obj = new System.Windows.Forms.Form();   This_obj = this;   GetFormWidth(This_obj); } ■↓DLL内のコード public class DLL {   public static void GetFormWidth(System.Windows.Forms.Form Form_obj) {     //引数のwidthを表示する。     System.Diagnostics.Debug.WriteLine(Form_boj.Width.Tostring());   } }

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

  • ベストアンサー
回答No.1

- DLLじゃなかったらうまくいきますか? 確認しましたか? - ↓こうしなかったのはなぜですか? private void Form1_Load(object sender, EventArgs e) {   GetFormWidth(this); }

kyotokyo
質問者

補足

修正できました。ご回答ありがとうございます。

関連するQ&A

  • VB.NETでDLL関数を呼び出すには

    VB.NETでDLLの関数を呼び出す時に、 NewではなくCreateObject()を使って呼び出すには、 どのように記述をすればよいのでしょうか。 具体的には、 ソリューション名 ClassLibrary1で ---------------------------------- Imports System.Windows.Forms Public Class Class1 Public Sub test() MessageBox.Show("テスト") End Sub End Class ---------------------------------- のコードをビルドしてClassLibrary1.dllを生成して、 ソリューション名 ConsoleApp1で ---------------------------------- Imports ClassLibrary1 Module Module1 Sub Main() Dim obj As Class1 obj = New Class1() 'obj = CreateObject("Class1") obj.test() End Sub End Module ---------------------------------- のコードをビルドして実行すると、 正しく実行できますが、 obj = New Class1() を obj = CreateObject("Class1") のようにすると図のようなエラーになります。 Newではなく、CreateObject()を使ってDLLを呼び出すには、 どのように記述をすればよいのでしょうか。 よろしくお願いします。 (Windows10)(Visual Studio 2022)

  • C#

    form2で入力した文字を form1で表示させたいのですが、上手くいきません。プログラムの(文字制限の為)一部だけ のせます。アドバイス よろしくお願いします。 まず、form1 public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.MainMenu mainMenu1; private System.Windows.Forms.MenuItem menuItem1; private System.Windows.Forms.MenuItem menuItem2; private System.Windows.Forms.Label label1; private Form2 form2; /// <summary> /// 必要なデザイナ変数です。 /// </summary> private System.ComponentModel.Container components = null; public Form1() { // // Windows フォーム デザイナ サポートに必要です。 // InitializeComponent(); form2= new Form2(); label1.Text=string.Format("{0}",form2.s); // // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。 // } static void Main() { Application.Run(new Form1()); } private void menuItem2_Click(object sender, System.EventArgs e) { if (form2.ShowDialog(this) == DialogResult.OK) this.Refresh(); } } 次にform2です private void button1_Click(object sender, System.EventArgs e) { string s; s=(string)textBox1.Text; } public string s { get { return s; } }

  • C++で作ったDLLをC#で使うには?

    C#でC++で書いたDLLを使いたいと思っていますが、可能でしょうか? 本で調べてみると出来ると思って挑戦しています。 public class Form1 : System.Windows.Forms.Form { [DllImport("test.dll")] public static extern long abc(); ..... と宣言し、使う時には long a = abc(); としています。 しかし、いざデバッグして実行してみると、エントリポイントが見つかりません。と表示されてしまいます。 (そもそもDLLが使えるのならばですが)できればC#でC++のDLLが使いたいため、詳しい方ご教授願います。

  • C#: DLL関数に整数の参照を渡すには?

    前略  @IT の”Win32 APIやDLL関数を呼び出すには?”(下記URL)を読んでVisual Studio 2012のC#をつかって、DLL関数に整数の参照を渡すプログラムをつくったのですが期待通り動作しません。 http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html  以下のソースコードのどこが間違っているのでしょうか? わかる方がいらっしゃったら教えてください。  ・マウスのボタンの数を取得して ラベルとメッセージボックスに表示するプログラムですが、いずれも 初期値の8が表示されて 参照による取得がうまくできません。また、GetNumberOfConsoleMouseButtons( ) の戻り値もFlase(0)が表示されます。  ・GetNumberOfConsoleMouseButtons( ) の諸元は下記です。 BOOL GetNumberOfConsoleMouseButtons( LPDWORD lpNumberOfMouseButtons // ボタン数のアドレス ); パラメータ lpNumberOfMouseButtons: マウスのボタン数を受け取る 32 ビット変数へのポインタを指定します。 戻り値 関数が成功すると、0 以外の値が返ります。 関数が失敗すると、0 が返ります。 以上、よろしくお願いします 以下、Form1.cs 全ソースコードです。 //---------------------------------------------------------- using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices; // 追加 namespace DLL_呼出し_参照 { public partial class Form1 : Form { //宣言部 [DllImport("kernel32.dll")] extern static bool GetNumberOfConsoleMouseButtons(ref uint lpNumberOfMouseButtons); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { uint Num; bool Flag; Num = 8; Flag = GetNumberOfConsoleMouseButtons(ref Num); //関数の呼び出し label1.Text = Num.ToString(); label2.Text = Flag.ToString(); //戻り値 成功すると0以外が戻る string msg = String.Format("Num={0}",Num); MessageBox.Show(msg); //メッセージボックス表示 } } }

  • 他クラスからForm1にアクセス

    Class1からForm1のtextBox1にアクセスする件、oboroxxさんの明快な回答を 参考にしまして、何とか下記の様にコードの実装が出来ました。 初めての事ですから、コメント頂けますと、大変有難いです。 追加質問: Q1) button1_Clickの中に、『Class1 obj=new Class1();』があります。 ここで、newで作られました、objはGCの対象になりますか? いや、そうではなく、button1_Clickが終了すると、objは消滅しますか? お手数ですが、宜しくお願いします。 ============================ using System; using System.Windows.Forms; namespace TT_SendMessage { public partial class Form1:Form { public Form1() { InitializeComponent(); } public void write_textBox1(string str){ textBox1.Text=str; //<---OK Console.WriteLine("VVVVVVVVVVVVVv"); } private void button1_Click(object sender,EventArgs e) { Class1 obj=new Class1(); obj.fm1_pr=this; obj.bbb(); //write_textBox1("aaa"); //<---OK } }// public partial class Form1:Form { //================ class Class1 { private Form1 fm1=new Form1(); public Form1 fm1_pr { set { this.fm1=value;} get { return this.fm1;} }//Form1 fm1 public void bbb() { fm1.write_textBox1("bbb");//non_static } }//class Class1 { //================ } 以上、宜しくお願いします。

  • C# フォームのShow()をオーバーライド

    ご質問があります。 フォームが二つ(フォームA、フォームB)あり、フォームAからフォームBを開く時に、フォームBにコードを渡す必要があり、フォームBのShow()をオーバーライドさせて(Show()に引数を設定し、引数でコードを渡し、フォームBの変数にコードをセットして使用する)、コードを使用します。 このShow()のオーバーライドのさせ方なのですが、以下ではエラーが出てしまいました。 public partial class FormB : Form { private string hacyucode; public FormB() { InitializeComponent(); } override void Show(string code) { hacyucode = code; } } ※「オーバーライドする適切なメソッドが見つかりませんでした。」というエラーが出てしまいます。 Show()の適切なオーバーライドの方法をご教授していただけませんでしょうか。 よろしくお願い致します。

  • C# フォームのShow()のオーバーライド

    ご質問があります。 フォームが二つ(フォームA、フォームB)あり、フォームAからフォームBを開く時に、フォームBにコードを渡す必要があり、フォームBのShow()をオーバーライドさせて(Show()に引数を設定し、引数でコードを渡し、フォームBの変数にコードをセットして使用する)、コードを使用します。 このShow()のオーバーライドのさせ方なのですが、以下ではエラーが出てしまいました。 public partial class FormB : Form { private string hacyucode; public FormB() { InitializeComponent(); } override void Show(string code) { hacyucode = code; } } ※「オーバーライドする適切なメソッドが見つかりませんでした。」というエラーが出てしまいます。 Show()の適切なオーバーライドの方法をご教授していただけませんでしょうか。 よろしくお願い致します。

  • C#でWin32 MFC DLLが呼び出せない

    C#で以下のエラーが発生し、非常に困ってます。 色々とサイトを見たのですが、DLLが本当にないのでは?という意見が多かったです。 しかし、私の方はDLLファイルはbin->debugフォルダ , obj->debugフォルダ、System32に置いてます。 問題が分かる方、是非教えてください! using System.Runtime.InteropServices; namespace WindowsFormsApplication { public partial class Form1 : Form { [DllImport("Win32DLL_TEST.dll")] private extern static int func(int x, int y); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int n = func3(5, 7);//ここでエラー! } } } エラー内容 'System.DllNotFoundException' のハンドルされていない例外が WindowsFormsApplication.exe で発生しました。 追加情報: DLL 'Win32DLL_TEST.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E) 備考 DLLは自作のWin32 DLL です。 extern "C"{ __declspec(dllexport) int __cdecl func(int x, int y) } と宣言し、VC++のMFC dialog上では呼び出しを成功しています。

  • C言語について質問・・・

    柴田望洋氏の著書である明解C言語(入門編)をもとに visual C++を使ってC言語の勉強をしているのですが まず最初に15+37の計算をしようと書いてあり、とりあえず わからない文法だらけだと思うが、下の通りそのまま入力してみよう と書いてあるのですが、その文章をそのまま入力してみたところ いきなりビルドエラーがでてきました。 ↓が実際の文章です。 /* 整数値15と37の和を表示する */ #include <stdio.h> int main(void) { printf("%d",15+37); /*整数値15と37の和を10進数で表示*/ return(0); } ※本書そのままを入力しており、全角半角のミスはないと思います。 しかし、実際新しいプロジェクトを作り立ち上げた瞬間に意味の分からない 文字の羅列が出てきてそのあとに上の文章を書いてあります。 ↓がその文章 #pragma once namespace lesson01 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Form1 の概要 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // } protected: /// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> ~Form1() { if (components) { delete components; } } private: /// <summary> /// 必要なデザイナー変数です。 /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// デザイナー サポートに必要なメソッドです。このメソッドの内容を /// コード エディターで変更しないでください。 /// </summary> void InitializeComponent(void) { this->SuspendLayout(); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 12); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(284, 262); this->Name = L"Form1"; this->Text = L"Form1"; this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load); this->ResumeLayout(false); } #pragma endregion private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { } }; } /* 整数値15と37の和を表示する */ #include <stdio.h> int main(void) { printf("%d",15+37); /*整数値15と37の和を10進数で表示*/ return(0); } となっております。 ※lesson01はプロジェクト名です。 ビルドエラーは 1>------ ビルド開始: プロジェクト: lesson01, 構成: Debug Win32 ------ 1> lesson01.cpp 1>lesson01.cpp(10): error C2731: 'main' : 関数はオーバーロードできません。 1> lesson01.cpp(9) : 'main' の宣言を確認してください。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== 保存先はwindows フォームアプリケーションを選び保存しています

  • C#のtextBox1への書込に関する質問

    C#(VS2013)のtextBox1への書込に関する質問です。 『textBox1.Text=str;』による、textBox1の書き込みは、『button1_Click』 の中から、直接『//write_textBox1("aaa"); 』を実行すれば出来ます。 しかし、Class1のtestを介して、『write_textBox1("bbb");』を実行した場合には textBox1に表示が出来ません。 尚、Consoleには、何れの場合にも表示出来ます。 Q1)Class1のtestを介して、textBox1への表示は可能ですか? =========== using System; using System.Windows.Forms; namespace TT_SendMessage { public partial class Form1:Form { public Form1() { InitializeComponent(); } public void write_textBox1(string str){ textBox1.Text=str; Console.WriteLine("VVVVVVVVVVVVVv"); } private void button1_Click(object sender,EventArgs e) { Class1 obj=new Class1(); obj.test(); //write_textBox1("aaa"); //<---この場合は、表示が出来る } }// public partial class Form1:Form { class Class1 { public void test() { bbb(); } public void bbb() { Form1 obj=new Form1(); obj.write_textBox1("bbb"); } }//class Class1 { } =============== 以上、宜しくお願いします。

専門家に質問してみよう