DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームからサーバーバッチ起動

環境/言語:[Windows2000 .NET Frameworkのバージョン(1.0, 1.1)]
分類:[.NET]

こんにちは、はじめまして。
質問させてください。
クライアントのフォームに配置したボタンのクリックイベントで、サーバーにある実行ファイルをキックしたいと思い、小さいプログラムを作ったのですが、うまく動作しません。
言語はC#です。
自分のマシンにIISを立てて、実行ファイルを起動するWebServiceを作成したのですが、フォームのボタンクリックでWebService内のメソッド"HelloWorld()"をコールすると、

「System.TypeLoadException'のハンドルされていない例外が system.windows.forms.dll で発生しました。

追加情報:アセンブリ'WindowsApplication1, Version=1.0.1894.25608, Culture=neutral, PublicKeyToken=null'から型'WebService1.WebService1.Service1' を読み込めません。」

というメッセージが表示され、落ちてしまいます。
HelloWorld()メソッドは、WebServiceプロジェクトを新規作成すると、コメント付で自動生成されるメソッドで、その中に以下のコードを追加したものです。

Process myProcess = new Process();
myProcess.StartInfo.FileName = "C:\\Inetpub\\wwwroot\\WebService1\\ConsoleApplication1.exe";
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
myProcess.Start();

このようなことを実現しているサンプルコードのありかなど、や解決方法を教えていただけるとうれしいです。
初歩的な質問ですが、何卒宜しくお願い致します。
■No9691に返信(ひろたろさんの記事)

> クライアントのフォームに配置したボタンのクリックイベントで、
> サーバーにある実行ファイルをキックしたいと思い、小さいプログラムを
> 作ったのですが、うまく動作しません。

どこがうまくいかないのか、ちょっとわかりにくいですね。
まず、作成したWebServiceを単体でテストしてみて、思ったとおりの
動作をするかどうかは確認していますか?

つぎに、HelloWorldメソッドにコードを追加していない状態で
Windowsフォームから呼び出せるかどうかは確認していますか?

これらの単体での結果を確認してからでないと、問題点を
見つけるのが難しそうなので、まず確認してみてください。
小野@どっとねっとふぁん様

返信ありがとうございます。
恥ずかしい話、自分でもどこが悪いのかわかりませんでした。
ご指摘通り、WebService側とWindowsフォーム側で切り分けてテストを行いましたところ、ちゃんと動くようになりました。
参考にもならないと思いますが、動いたソースを貼り付けさせていただきます。
ありがとうございました。

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WebTest.WindowsApp
{
/// <summary>
/// Form1 の概要の説明です。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Label label1;
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Windows フォーム デザイナ サポートに必要です。
//
InitializeComponent();

//
// TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
//
}

/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows フォーム デザイナで生成されたコード
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(8, 96);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "実行";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(96, 96);
this.button2.Name = "button2";
this.button2.TabIndex = 1;
this.button2.Text = "終了";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// label1
//
this.label1.BackColor = System.Drawing.Color.White;
this.label1.Location = new System.Drawing.Point(8, 8);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(160, 72);
this.label1.TabIndex = 2;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
this.ClientSize = new System.Drawing.Size(176, 125);
this.Controls.Add(this.label1);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void button2_Click(object sender, System.EventArgs e)
{
this.Close();
}

private void button1_Click(object sender, System.EventArgs e)
{
WebApp.Service1 ws = new WebApp.Service1();
label1.Text = ws.HelloWorld();
}
}
}


using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

namespace WebTest.WebApp
{
/// <summary>
/// Service1 の概要の説明です。
/// </summary>
public class Service1 : System.Web.Services.WebService
{
public Service1()
{
//CODEGEN: この呼び出しは、ASP.NET Web サービス デザイナで必要です。
InitializeComponent();
}

#region コンポーネント デザイナで生成されたコード

//Web サービス デザイナで必要です。
private IContainer components = null;

/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
}

/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}

#endregion

// Web サービスの例
// HelloWorld() サンプル サービスは、Hello World という文字列を返します。
// ビルドするには、以下の行からコメントを外してプロジェクトを保存、ビルドしてください。
// この Web サービスをテストするには、F5 キーを押してください。

[WebMethod]
public string HelloWorld()
{
Process myProcess = new Process();
myProcess.StartInfo.FileName = "notepad.exe";
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
myProcess.Start();
return myProcess.Start().ToString();
}
}
}
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板