teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

7

2019/03/17 06:17

投稿

skytomo
skytomo

スコア35

title CHANGED
File without changes
body CHANGED
@@ -6,6 +6,9 @@
6
6
  Windowsアプリケーションと同じ動作をさせるためには、何が必要ですか。
7
7
  どこに問題がありますか。
8
8
 
9
+ **追記**
10
+ 私が最終的にしたいことは**Web BrowserでJava Scriptを処理させ、C#で結果を受け取ること**です。フォームを表示せずにWeb Browserを通じてJava Scriptとやりとりをしたいのです。
11
+
9
12
  ### 発生している問題・エラーメッセージ
10
13
 
11
14
  Windowsアプリケーションでは`Hello, world!`と表示されるが、

6

2019/03/17 06:16

投稿

skytomo
skytomo

スコア35

title CHANGED
File without changes
body CHANGED
@@ -12,7 +12,7 @@
12
12
  コンソールアプリケーションでは`null`になる。
13
13
 
14
14
  **追記**
15
- y_waiwaiさんの指摘により、ソースコードが比較できるように変更したところ、
15
+ Zuishinさんの指摘により、ソースコードが比較できるように変更したところ、
16
16
  Windowsアプリケーションでも動作が怪しくなったため、
17
17
  Windowsアプリケーションでも、コンソールアプリケーションでも動作がうまくいかない問題に直面しています。
18
18
  (詳しくは追記を見てください。)
@@ -151,7 +151,7 @@
151
151
 
152
152
  ### 追記
153
153
 
154
- y_waiwaiさんの指摘により、ソースコードを同じにしてみようとしてみました。
154
+ Zuishinさんの指摘により、ソースコードを同じにしてみようとしてみました。
155
155
 
156
156
  まずコンソールアプリケーションの場合です。
157
157
  コンソールアプリケーションのときは参照から「System.Windows.Forms」を追加しなければなりません。

5

2019/03/17 06:14

投稿

skytomo
skytomo

スコア35

title CHANGED
File without changes
body CHANGED
@@ -149,18 +149,6 @@
149
149
 
150
150
  ~~`(null)`と表示されます。~~
151
151
 
152
- ### 試したこと
153
-
154
- 本当はもっと複雑だったのですが、
155
- 問題を探るため、上のように単純化したところ、
156
- そもそも、関数`cs_func`が文字列`"Hello, world!"`を返していないことが分かりました。
157
- それか、関数`cs_func`が呼び出される前に例外が発生して実行されていないかもしれません。
158
- とにかく、原因が分かりません。
159
- 原因が分からないため、対処のしようがありません。
160
- どうしたらいいのでしょうか。
161
-
162
- `<meta http-equiv=""X-UA-Compatible"" content=""IE=11"" />`を消してみても状況は変わらないので関係ないと思います。(Window アプリケーションは問題なく動くし、コンソールアプリケーションは動かない)
163
-
164
152
  ### 追記
165
153
 
166
154
  y_waiwaiさんの指摘により、ソースコードを同じにしてみようとしてみました。

4

問題の変更

2019/03/17 05:50

投稿

skytomo
skytomo

スコア35

title CHANGED
File without changes
body CHANGED
@@ -11,6 +11,14 @@
11
11
  Windowsアプリケーションでは`Hello, world!`と表示されるが、
12
12
  コンソールアプリケーションでは`null`になる。
13
13
 
14
+ **追記**
15
+ y_waiwaiさんの指摘により、ソースコードが比較できるように変更したところ、
16
+ Windowsアプリケーションでも動作が怪しくなったため、
17
+ Windowsアプリケーションでも、コンソールアプリケーションでも動作がうまくいかない問題に直面しています。
18
+ (詳しくは追記を見てください。)
19
+
20
+ 私のソースコードはどのような動作をしているのでしょうか。
21
+
14
22
  ### 該当のソースコード
15
23
 
16
24
  追記の方を見てください。
@@ -351,8 +359,6 @@
351
359
  おそらく、Java Scriptの方には問題がない(上記に示すように不安定だが動くときは動くので)とは思うのですが、
352
360
  原因と対処法を教えていただきたいです。
353
361
 
354
-
355
-
356
362
  ### 補足情報
357
363
 
358
364
  ターゲットフレームワーク: `.NET Framework 4.7.1`

3

ソースコードを比較できるように改善

2019/03/17 05:44

投稿

skytomo
skytomo

スコア35

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- C#で外部から読み込んだJava Scriptで処理をしようとしたのですが、
3
+ [C#で外部から読み込んだJava Scriptで処理をしよう](https://qiita.com/Geochelone/items/996c371f9168e525e9c2)としたのですが、
4
4
  Windowsアプリケーションでは動くものが、コンソールアプリケーションでは動きません。
5
5
 
6
6
  Windowsアプリケーションと同じ動作をさせるためには、何が必要ですか。
@@ -13,8 +13,10 @@
13
13
 
14
14
  ### 該当のソースコード
15
15
 
16
- Windows アプリケーション場合
16
+ 追記方を見てください。
17
17
 
18
+ ~~Windows アプリケーションの場合~~
19
+
18
20
  ```csharp
19
21
  using System;
20
22
  using System.Runtime.InteropServices;
@@ -73,9 +75,9 @@
73
75
  }
74
76
  ```
75
77
 
76
- Button1を押すと、`button1_click`が呼び出され、コンソールに`Hello, world!`と表示されます。
78
+ ~~Button1を押すと、`button1_click`が呼び出され、コンソールに`Hello, world!`と表示されます。~~
77
79
 
78
- コンソールアプリケーションの場合
80
+ ~~コンソールアプリケーションの場合~~
79
81
 
80
82
  ```csharp
81
83
  using System;
@@ -137,7 +139,7 @@
137
139
  }
138
140
  ```
139
141
 
140
- `(null)`と表示されます。
142
+ ~~`(null)`と表示されます。~~
141
143
 
142
144
  ### 試したこと
143
145
 
@@ -151,6 +153,206 @@
151
153
 
152
154
  `<meta http-equiv=""X-UA-Compatible"" content=""IE=11"" />`を消してみても状況は変わらないので関係ないと思います。(Window アプリケーションは問題なく動くし、コンソールアプリケーションは動かない)
153
155
 
156
+ ### 追記
157
+
158
+ y_waiwaiさんの指摘により、ソースコードを同じにしてみようとしてみました。
159
+
160
+ まずコンソールアプリケーションの場合です。
161
+ コンソールアプリケーションのときは参照から「System.Windows.Forms」を追加しなければなりません。
162
+
163
+ ```csharp
164
+ using System;
165
+ using System.Runtime.InteropServices;
166
+ using System.Windows.Forms;
167
+
168
+ namespace ConsoleApp1
169
+ {
170
+ class Program
171
+ {
172
+ [STAThread]
173
+ static void Main(string[] args)
174
+ {
175
+ var parser = new MyClass();
176
+ var result = parser.Parse();
177
+ Console.WriteLine(result ?? "(null)");
178
+ }
179
+ }
180
+
181
+ public class MyClass
182
+ {
183
+ public string Text { get; set; }
184
+ public object Result { get; private set; }
185
+ public WebBrowser WebBrowser { get; } = new WebBrowser();
186
+ public ParseResult ParseResultObject { get; set; } = new ParseResult();
187
+ public string Parse()
188
+ {
189
+ WebBrowser.DocumentText = @"
190
+ <html>
191
+ <head>
192
+ <meta charset=""utf-8"" />
193
+ <meta http-equiv=""X-UA-Compatible"" content=""IE=11"" />
194
+ <title>title</title>
195
+ </head>
196
+ <body>
197
+ <script>
198
+ function cs_func(text) {
199
+ external.Result = text;
200
+ }
201
+ </script>
202
+ <h1>Hello!</h1>
203
+ </body>
204
+ </html>
205
+ ";
206
+ WebBrowser.ObjectForScripting = ParseResultObject;
207
+ WebBrowser.Document.InvokeScript("cs_func", new string[] { "Hello, world!" });
208
+ return ParseResultObject.Result;
209
+ }
210
+
211
+ [ComVisible(true)]
212
+ public class ParseResult
213
+ {
214
+ public string Result { get; set; }
215
+ }
216
+ }
217
+ }
218
+ ```
219
+
220
+ 次にWindows アプリケーションです。
221
+ Form1に同じようなコードを書いてみたところ、
222
+ Windows アプリケーションでも`(null)`が表示されるようになってしまいました。
223
+
224
+ ```csharp
225
+ using System;
226
+ using System.Runtime.InteropServices;
227
+ using System.Windows.Forms;
228
+
229
+ namespace WindowsFormsApp1
230
+ {
231
+ public partial class Form1 : Form
232
+ {
233
+ public MyClass Parser;
234
+
235
+ public Form1()
236
+ {
237
+ InitializeComponent();
238
+ Parser = new MyClass();
239
+ var result = Parser.Parse();
240
+ Console.WriteLine(result ?? "(null)");
241
+ }
242
+ }
243
+
244
+ public class MyClass
245
+ {
246
+ public string Text { get; set; }
247
+ public object Result { get; private set; }
248
+ public WebBrowser WebBrowser { get; set; } = new WebBrowser();
249
+ public ParseResult ParseResultObject { get; set; } = new ParseResult();
250
+ public string Parse()
251
+ {
252
+ WebBrowser.DocumentText = @"
253
+ <html>
254
+ <head>
255
+ <meta charset=""utf-8"" />
256
+ <meta http-equiv=""X-UA-Compatible"" content=""IE=11"" />
257
+ <title>title</title>
258
+ </head>
259
+ <body>
260
+ <script>
261
+ function cs_func(text) {
262
+ external.Result = text;
263
+ }
264
+ </script>
265
+ <h1>Hello!</h1>
266
+ </body>
267
+ </html>
268
+ ";
269
+ WebBrowser.ObjectForScripting = ParseResultObject;
270
+ WebBrowser.Document.InvokeScript("cs_func", new string[] { "Hello, world!" });
271
+ return ParseResultObject.Result;
272
+ }
273
+
274
+ [ComVisible(true)]
275
+ public class ParseResult
276
+ {
277
+ public string Result { get; set; }
278
+ }
279
+ }
280
+ }
281
+ ```
282
+
283
+ しかし、Form1の上にボタンを設置し、クリックしたときに処理するようコードを変更したところ、
284
+ 1回だけ押した時は`(null)`と表示され、2回目以降は`Hello, world!`と表示されるといった不安定な感じで表示されるようになりました。
285
+
286
+ ```csharp
287
+ using System;
288
+ using System.Runtime.InteropServices;
289
+ using System.Windows.Forms;
290
+
291
+ namespace WindowsFormsApp1
292
+ {
293
+ public partial class Form1 : Form
294
+ {
295
+ public MyClass Parser;
296
+
297
+ public Form1()
298
+ {
299
+ InitializeComponent();
300
+ Parser = new MyClass();
301
+ }
302
+
303
+ // ここに追加しました。
304
+ private void Button_Click(object sender, EventArgs e)
305
+ {
306
+ var result = Parser.Parse();
307
+ Console.WriteLine(result ?? "(null)");
308
+ }
309
+ }
310
+
311
+ public class MyClass
312
+ {
313
+ public string Text { get; set; }
314
+ public object Result { get; private set; }
315
+ public WebBrowser WebBrowser { get; set; } = new WebBrowser();
316
+ public ParseResult ParseResultObject { get; set; } = new ParseResult();
317
+ public string Parse()
318
+ {
319
+ WebBrowser.DocumentText = @"
320
+ <html>
321
+ <head>
322
+ <meta charset=""utf-8"" />
323
+ <meta http-equiv=""X-UA-Compatible"" content=""IE=11"" />
324
+ <title>title</title>
325
+ </head>
326
+ <body>
327
+ <script>
328
+ function cs_func(text) {
329
+ external.Result = text;
330
+ }
331
+ </script>
332
+ <h1>Hello!</h1>
333
+ </body>
334
+ </html>
335
+ ";
336
+ WebBrowser.ObjectForScripting = ParseResultObject;
337
+ WebBrowser.Document.InvokeScript("cs_func", new string[] { "Hello, world!" });
338
+ return ParseResultObject.Result;
339
+ }
340
+
341
+ [ComVisible(true)]
342
+ public class ParseResult
343
+ {
344
+ public string Result { get; set; }
345
+ }
346
+ }
347
+ }
348
+ ```
349
+
350
+ 全くもって原因が分かりません。
351
+ おそらく、Java Scriptの方には問題がない(上記に示すように不安定だが動くときは動くので)とは思うのですが、
352
+ 原因と対処法を教えていただきたいです。
353
+
354
+
355
+
154
356
  ### 補足情報
155
357
 
156
358
  ターゲットフレームワーク: `.NET Framework 4.7.1`

2

ソースコードの編集

2019/03/17 05:37

投稿

skytomo
skytomo

スコア35

title CHANGED
File without changes
body CHANGED
@@ -55,7 +55,6 @@
55
55
  </html>
56
56
  ";
57
57
  webBrowser1.ObjectForScripting = parseResult;
58
- Console.WriteLine("after " + webBrowser1.DocumentText);
59
58
  }
60
59
 
61
60
  [ComVisible(true)]
@@ -115,7 +114,6 @@
115
114
  ";
116
115
  WebBrowser.ObjectForScripting = parse;
117
116
  WebBrowser.Document.InvokeScript("cs_func", new string[] { "test", "test 2" });
118
- Console.WriteLine();
119
117
  return parse.Result;
120
118
  }
121
119
 

1

ソースコードのミス

2019/03/17 03:32

投稿

skytomo
skytomo

スコア35

title CHANGED
File without changes
body CHANGED
@@ -47,11 +47,7 @@
47
47
  <body>
48
48
  <script>
49
49
  function cs_func(text, mode) {
50
- var result = camxes.parse(text);
51
- var result_str = camxes_postprocessing(result, mode);
52
- window.external.Result = result_str;
53
50
  window.external.Result = ""Hello, world!"";
54
- alert(result_str);
55
51
  }
56
52
  </script>
57
53
  <h1>Hello!</h1>
@@ -78,7 +74,7 @@
78
74
  }
79
75
  ```
80
76
 
81
- button1_clickを押すと、コンソールに`Hello, world!`と表示されます。
77
+ Button1を押すと、`button1_click`が呼び出され、コンソールに`Hello, world!`と表示されます。
82
78
 
83
79
  コンソールアプリケーションの場合
84
80