質問編集履歴

7

2019/03/17 06:17

投稿

skytomo
skytomo

スコア35

test CHANGED
File without changes
test CHANGED
@@ -14,6 +14,12 @@
14
14
 
15
15
 
16
16
 
17
+ **追記**
18
+
19
+ 私が最終的にしたいことは**Web BrowserでJava Scriptを処理させ、C#で結果を受け取ること**です。フォームを表示せずにWeb Browserを通じてJava Scriptとやりとりをしたいのです。
20
+
21
+
22
+
17
23
  ### 発生している問題・エラーメッセージ
18
24
 
19
25
 

6

2019/03/17 06:16

投稿

skytomo
skytomo

スコア35

test CHANGED
File without changes
test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  **追記**
28
28
 
29
- y_waiwaiさんの指摘により、ソースコードが比較できるように変更したところ、
29
+ Zuishinさんの指摘により、ソースコードが比較できるように変更したところ、
30
30
 
31
31
  Windowsアプリケーションでも動作が怪しくなったため、
32
32
 
@@ -304,7 +304,7 @@
304
304
 
305
305
 
306
306
 
307
- y_waiwaiさんの指摘により、ソースコードを同じにしてみようとしてみました。
307
+ Zuishinさんの指摘により、ソースコードを同じにしてみようとしてみました。
308
308
 
309
309
 
310
310
 

5

2019/03/17 06:14

投稿

skytomo
skytomo

スコア35

test CHANGED
File without changes
test CHANGED
@@ -300,30 +300,6 @@
300
300
 
301
301
 
302
302
 
303
- ### 試したこと
304
-
305
-
306
-
307
- 本当はもっと複雑だったのですが、
308
-
309
- 問題を探るため、上のように単純化したところ、
310
-
311
- そもそも、関数`cs_func`が文字列`"Hello, world!"`を返していないことが分かりました。
312
-
313
- それか、関数`cs_func`が呼び出される前に例外が発生して実行されていないかもしれません。
314
-
315
- とにかく、原因が分かりません。
316
-
317
- 原因が分からないため、対処のしようがありません。
318
-
319
- どうしたらいいのでしょうか。
320
-
321
-
322
-
323
- `<meta http-equiv=""X-UA-Compatible"" content=""IE=11"" />`を消してみても状況は変わらないので関係ないと思います。(Window アプリケーションは問題なく動くし、コンソールアプリケーションは動かない)
324
-
325
-
326
-
327
303
  ### 追記
328
304
 
329
305
 

4

問題の変更

2019/03/17 05:50

投稿

skytomo
skytomo

スコア35

test CHANGED
File without changes
test CHANGED
@@ -24,6 +24,22 @@
24
24
 
25
25
 
26
26
 
27
+ **追記**
28
+
29
+ y_waiwaiさんの指摘により、ソースコードが比較できるように変更したところ、
30
+
31
+ Windowsアプリケーションでも動作が怪しくなったため、
32
+
33
+ Windowsアプリケーションでも、コンソールアプリケーションでも動作がうまくいかない問題に直面しています。
34
+
35
+ (詳しくは追記を見てください。)
36
+
37
+
38
+
39
+ 私のソースコードはどのような動作をしているのでしょうか。
40
+
41
+
42
+
27
43
  ### 該当のソースコード
28
44
 
29
45
 
@@ -704,10 +720,6 @@
704
720
 
705
721
 
706
722
 
707
-
708
-
709
-
710
-
711
723
  ### 補足情報
712
724
 
713
725
 

3

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

2019/03/17 05:44

投稿

skytomo
skytomo

スコア35

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- C#で外部から読み込んだJava Scriptで処理をしようとしたのですが、
5
+ [C#で外部から読み込んだJava Scriptで処理をしよう](https://qiita.com/Geochelone/items/996c371f9168e525e9c2)としたのですが、
6
6
 
7
7
  Windowsアプリケーションでは動くものが、コンソールアプリケーションでは動きません。
8
8
 
@@ -28,7 +28,11 @@
28
28
 
29
29
 
30
30
 
31
+ 追記の方を見てください。
32
+
33
+
34
+
31
- Windows アプリケーションの場合
35
+ ~~Windows アプリケーションの場合~~
32
36
 
33
37
 
34
38
 
@@ -148,11 +152,11 @@
148
152
 
149
153
 
150
154
 
151
- Button1を押すと、`button1_click`が呼び出され、コンソールに`Hello, world!`と表示されます。
155
+ ~~Button1を押すと、`button1_click`が呼び出され、コンソールに`Hello, world!`と表示されます。~~
152
-
153
-
154
-
156
+
157
+
158
+
155
- コンソールアプリケーションの場合
159
+ ~~コンソールアプリケーションの場合~~
156
160
 
157
161
 
158
162
 
@@ -276,7 +280,7 @@
276
280
 
277
281
 
278
282
 
279
- `(null)`と表示されます。
283
+ ~~`(null)`と表示されます。~~
280
284
 
281
285
 
282
286
 
@@ -304,6 +308,406 @@
304
308
 
305
309
 
306
310
 
311
+ ### 追記
312
+
313
+
314
+
315
+ y_waiwaiさんの指摘により、ソースコードを同じにしてみようとしてみました。
316
+
317
+
318
+
319
+ まずコンソールアプリケーションの場合です。
320
+
321
+ コンソールアプリケーションのときは参照から「System.Windows.Forms」を追加しなければなりません。
322
+
323
+
324
+
325
+ ```csharp
326
+
327
+ using System;
328
+
329
+ using System.Runtime.InteropServices;
330
+
331
+ using System.Windows.Forms;
332
+
333
+
334
+
335
+ namespace ConsoleApp1
336
+
337
+ {
338
+
339
+ class Program
340
+
341
+ {
342
+
343
+ [STAThread]
344
+
345
+ static void Main(string[] args)
346
+
347
+ {
348
+
349
+ var parser = new MyClass();
350
+
351
+ var result = parser.Parse();
352
+
353
+ Console.WriteLine(result ?? "(null)");
354
+
355
+ }
356
+
357
+ }
358
+
359
+
360
+
361
+ public class MyClass
362
+
363
+ {
364
+
365
+ public string Text { get; set; }
366
+
367
+ public object Result { get; private set; }
368
+
369
+ public WebBrowser WebBrowser { get; } = new WebBrowser();
370
+
371
+ public ParseResult ParseResultObject { get; set; } = new ParseResult();
372
+
373
+ public string Parse()
374
+
375
+ {
376
+
377
+ WebBrowser.DocumentText = @"
378
+
379
+ <html>
380
+
381
+ <head>
382
+
383
+ <meta charset=""utf-8"" />
384
+
385
+ <meta http-equiv=""X-UA-Compatible"" content=""IE=11"" />
386
+
387
+ <title>title</title>
388
+
389
+ </head>
390
+
391
+ <body>
392
+
393
+ <script>
394
+
395
+ function cs_func(text) {
396
+
397
+ external.Result = text;
398
+
399
+ }
400
+
401
+ </script>
402
+
403
+ <h1>Hello!</h1>
404
+
405
+ </body>
406
+
407
+ </html>
408
+
409
+ ";
410
+
411
+ WebBrowser.ObjectForScripting = ParseResultObject;
412
+
413
+ WebBrowser.Document.InvokeScript("cs_func", new string[] { "Hello, world!" });
414
+
415
+ return ParseResultObject.Result;
416
+
417
+ }
418
+
419
+
420
+
421
+ [ComVisible(true)]
422
+
423
+ public class ParseResult
424
+
425
+ {
426
+
427
+ public string Result { get; set; }
428
+
429
+ }
430
+
431
+ }
432
+
433
+ }
434
+
435
+ ```
436
+
437
+
438
+
439
+ 次にWindows アプリケーションです。
440
+
441
+ Form1に同じようなコードを書いてみたところ、
442
+
443
+ Windows アプリケーションでも`(null)`が表示されるようになってしまいました。
444
+
445
+
446
+
447
+ ```csharp
448
+
449
+ using System;
450
+
451
+ using System.Runtime.InteropServices;
452
+
453
+ using System.Windows.Forms;
454
+
455
+
456
+
457
+ namespace WindowsFormsApp1
458
+
459
+ {
460
+
461
+ public partial class Form1 : Form
462
+
463
+ {
464
+
465
+ public MyClass Parser;
466
+
467
+
468
+
469
+ public Form1()
470
+
471
+ {
472
+
473
+ InitializeComponent();
474
+
475
+ Parser = new MyClass();
476
+
477
+ var result = Parser.Parse();
478
+
479
+ Console.WriteLine(result ?? "(null)");
480
+
481
+ }
482
+
483
+ }
484
+
485
+
486
+
487
+ public class MyClass
488
+
489
+ {
490
+
491
+ public string Text { get; set; }
492
+
493
+ public object Result { get; private set; }
494
+
495
+ public WebBrowser WebBrowser { get; set; } = new WebBrowser();
496
+
497
+ public ParseResult ParseResultObject { get; set; } = new ParseResult();
498
+
499
+ public string Parse()
500
+
501
+ {
502
+
503
+ WebBrowser.DocumentText = @"
504
+
505
+ <html>
506
+
507
+ <head>
508
+
509
+ <meta charset=""utf-8"" />
510
+
511
+ <meta http-equiv=""X-UA-Compatible"" content=""IE=11"" />
512
+
513
+ <title>title</title>
514
+
515
+ </head>
516
+
517
+ <body>
518
+
519
+ <script>
520
+
521
+ function cs_func(text) {
522
+
523
+ external.Result = text;
524
+
525
+ }
526
+
527
+ </script>
528
+
529
+ <h1>Hello!</h1>
530
+
531
+ </body>
532
+
533
+ </html>
534
+
535
+ ";
536
+
537
+ WebBrowser.ObjectForScripting = ParseResultObject;
538
+
539
+ WebBrowser.Document.InvokeScript("cs_func", new string[] { "Hello, world!" });
540
+
541
+ return ParseResultObject.Result;
542
+
543
+ }
544
+
545
+
546
+
547
+ [ComVisible(true)]
548
+
549
+ public class ParseResult
550
+
551
+ {
552
+
553
+ public string Result { get; set; }
554
+
555
+ }
556
+
557
+ }
558
+
559
+ }
560
+
561
+ ```
562
+
563
+
564
+
565
+ しかし、Form1の上にボタンを設置し、クリックしたときに処理するようコードを変更したところ、
566
+
567
+ 1回だけ押した時は`(null)`と表示され、2回目以降は`Hello, world!`と表示されるといった不安定な感じで表示されるようになりました。
568
+
569
+
570
+
571
+ ```csharp
572
+
573
+ using System;
574
+
575
+ using System.Runtime.InteropServices;
576
+
577
+ using System.Windows.Forms;
578
+
579
+
580
+
581
+ namespace WindowsFormsApp1
582
+
583
+ {
584
+
585
+ public partial class Form1 : Form
586
+
587
+ {
588
+
589
+ public MyClass Parser;
590
+
591
+
592
+
593
+ public Form1()
594
+
595
+ {
596
+
597
+ InitializeComponent();
598
+
599
+ Parser = new MyClass();
600
+
601
+ }
602
+
603
+
604
+
605
+ // ここに追加しました。
606
+
607
+ private void Button_Click(object sender, EventArgs e)
608
+
609
+ {
610
+
611
+ var result = Parser.Parse();
612
+
613
+ Console.WriteLine(result ?? "(null)");
614
+
615
+ }
616
+
617
+ }
618
+
619
+
620
+
621
+ public class MyClass
622
+
623
+ {
624
+
625
+ public string Text { get; set; }
626
+
627
+ public object Result { get; private set; }
628
+
629
+ public WebBrowser WebBrowser { get; set; } = new WebBrowser();
630
+
631
+ public ParseResult ParseResultObject { get; set; } = new ParseResult();
632
+
633
+ public string Parse()
634
+
635
+ {
636
+
637
+ WebBrowser.DocumentText = @"
638
+
639
+ <html>
640
+
641
+ <head>
642
+
643
+ <meta charset=""utf-8"" />
644
+
645
+ <meta http-equiv=""X-UA-Compatible"" content=""IE=11"" />
646
+
647
+ <title>title</title>
648
+
649
+ </head>
650
+
651
+ <body>
652
+
653
+ <script>
654
+
655
+ function cs_func(text) {
656
+
657
+ external.Result = text;
658
+
659
+ }
660
+
661
+ </script>
662
+
663
+ <h1>Hello!</h1>
664
+
665
+ </body>
666
+
667
+ </html>
668
+
669
+ ";
670
+
671
+ WebBrowser.ObjectForScripting = ParseResultObject;
672
+
673
+ WebBrowser.Document.InvokeScript("cs_func", new string[] { "Hello, world!" });
674
+
675
+ return ParseResultObject.Result;
676
+
677
+ }
678
+
679
+
680
+
681
+ [ComVisible(true)]
682
+
683
+ public class ParseResult
684
+
685
+ {
686
+
687
+ public string Result { get; set; }
688
+
689
+ }
690
+
691
+ }
692
+
693
+ }
694
+
695
+ ```
696
+
697
+
698
+
699
+ 全くもって原因が分かりません。
700
+
701
+ おそらく、Java Scriptの方には問題がない(上記に示すように不安定だが動くときは動くので)とは思うのですが、
702
+
703
+ 原因と対処法を教えていただきたいです。
704
+
705
+
706
+
707
+
708
+
709
+
710
+
307
711
  ### 補足情報
308
712
 
309
713
 

2

ソースコードの編集

2019/03/17 05:37

投稿

skytomo
skytomo

スコア35

test CHANGED
File without changes
test CHANGED
@@ -112,8 +112,6 @@
112
112
 
113
113
  webBrowser1.ObjectForScripting = parseResult;
114
114
 
115
- Console.WriteLine("after " + webBrowser1.DocumentText);
116
-
117
115
  }
118
116
 
119
117
 
@@ -232,8 +230,6 @@
232
230
 
233
231
  WebBrowser.Document.InvokeScript("cs_func", new string[] { "test", "test 2" });
234
232
 
235
- Console.WriteLine();
236
-
237
233
  return parse.Result;
238
234
 
239
235
  }

1

ソースコードのミス

2019/03/17 03:32

投稿

skytomo
skytomo

スコア35

test CHANGED
File without changes
test CHANGED
@@ -96,16 +96,8 @@
96
96
 
97
97
  function cs_func(text, mode) {
98
98
 
99
- var result = camxes.parse(text);
100
-
101
- var result_str = camxes_postprocessing(result, mode);
102
-
103
- window.external.Result = result_str;
104
-
105
99
  window.external.Result = ""Hello, world!"";
106
100
 
107
- alert(result_str);
108
-
109
101
  }
110
102
 
111
103
  </script>
@@ -158,7 +150,7 @@
158
150
 
159
151
 
160
152
 
161
- button1_clickを押すと、コンソールに`Hello, world!`と表示されます。
153
+ Button1を押すと、`button1_click`が呼び出され、コンソールに`Hello, world!`と表示されます。
162
154
 
163
155
 
164
156