質問編集履歴

1

"試行内容"を追加致しました。ご確認よろしくお願い致します。

2019/10/20 09:02

投稿

tap_13
tap_13

スコア15

test CHANGED
File without changes
test CHANGED
@@ -16,6 +16,14 @@
16
16
 
17
17
  ![![イメージ説明](1c64d47da58a7a0556d2b1c4f0458540.png)
18
18
 
19
+
20
+
21
+ ### 進捗状況
22
+
23
+ Form1,Form2の画面の表示(インスタンスの生成)は出来ています。
24
+
25
+
26
+
19
27
  ### ソースコード
20
28
 
21
29
  ※フォーム1はC#、フォーム2はVBで開発しています。
@@ -32,12 +40,6 @@
32
40
 
33
41
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
34
42
 
35
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
36
-
37
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
38
-
39
- mc:Ignorable="d"
40
-
41
43
  Title="MainWindow" Height="450" Width="800">
42
44
 
43
45
  <Grid>
@@ -58,14 +60,6 @@
58
60
 
59
61
  ```
60
62
 
61
- using System.Diagnostics;
62
-
63
- using System.ServiceModel;
64
-
65
- using System.Windows;
66
-
67
-
68
-
69
63
  namespace Form1
70
64
 
71
65
  {
@@ -112,10 +106,6 @@
112
106
 
113
107
  /// </summary>
114
108
 
115
- /// <param name="sender"></param>
116
-
117
- /// <param name="e"></param>
118
-
119
109
  private void Button_Click(object sender, RoutedEventArgs e)
120
110
 
121
111
  {
@@ -126,30 +116,20 @@
126
116
 
127
117
  var message = Host.CallExecute(TextBox1.Text);
128
118
 
129
-
130
-
131
119
  MessageBox.Show(message);
132
120
 
133
121
  }
134
122
 
135
- catch(ProtocolException ex)
123
+ catch(FaultException<FailureInfo> fx)
136
124
 
137
125
  {
138
126
 
127
+ FailureInfo info = fx.Detail;
128
+
139
- MessageBox.Show(ex.Message);
129
+ MessageBox.Show(info.Message);
140
130
 
141
131
  }
142
132
 
143
- catch(FaultException<FailureInfo> fx)
144
-
145
- {
146
-
147
- FailureInfo info = fx.Detail;
148
-
149
- MessageBox.Show(info.Message);
150
-
151
- }
152
-
153
133
  }
154
134
 
155
135
  }
@@ -166,10 +146,6 @@
166
146
 
167
147
  ```
168
148
 
169
- using System.ServiceModel;
170
-
171
-
172
-
173
149
  namespace Form1
174
150
 
175
151
  {
@@ -198,14 +174,6 @@
198
174
 
199
175
  ```
200
176
 
201
- using System;
202
-
203
- using System.Reflection;
204
-
205
- using System.ServiceModel;
206
-
207
-
208
-
209
177
  namespace Form1
210
178
 
211
179
  {
@@ -238,10 +206,6 @@
238
206
 
239
207
  ```
240
208
 
241
- using System.Runtime.Serialization;
242
-
243
-
244
-
245
209
  namespace Form1
246
210
 
247
211
  {
@@ -270,45 +234,9 @@
270
234
 
271
235
 
272
236
 
273
- ⑥フォーム2のXAML
237
+ ⑥フォーム2のコードビハインドクラス
274
-
238
+
275
- ```
239
+ ```
276
-
277
- <Window x:Class="MainWindow"
278
-
279
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
280
-
281
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
282
-
283
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
284
-
285
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
286
-
287
- mc:Ignorable="d"
288
-
289
- Title="MainWindow" Height="450" Width="800">
290
-
291
- <Grid>
292
-
293
- <TextBox x:Name="TextBox1" HorizontalAlignment="Left" Height="23" Margin="50,33,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
294
-
295
- </Grid>
296
-
297
- </Window>
298
-
299
- ```
300
-
301
-
302
-
303
- ⑦フォーム2のコードビハインドクラス
304
-
305
- ```
306
-
307
- Imports System.ServiceModel
308
-
309
- Imports Form1
310
-
311
-
312
240
 
313
241
  ''' <summary>
314
242
 
@@ -318,62 +246,46 @@
318
246
 
319
247
  Public Class MainWindow
320
248
 
321
-
322
-
323
249
  Public Host As ServiceHost
324
250
 
325
-
326
-
327
251
  Public Const Uri As String = "net.pipe://localhost/Form2"
328
252
 
329
253
 
330
254
 
255
+ Public Sub New()
256
+
257
+ Host = New ServiceHost(GetType(WcfClient))
258
+
259
+ Host.AddServiceEndpoint(
260
+
261
+ GetType(IWcfClient),
262
+
263
+ New NetNamedPipeBinding(NetNamedPipeSecurityMode.None),
264
+
265
+ New Uri(Uri))
266
+
267
+ Host.Open()
268
+
269
+
270
+
271
+ InitializeComponent()
272
+
273
+ End Sub
274
+
275
+
276
+
331
277
  ''' <summary>
332
278
 
333
- ''' コンスト
279
+ ''' テキストボッスに値をセットする
334
280
 
335
281
  ''' </summary>
336
282
 
337
- Public Sub New()
338
-
339
- Host = New ServiceHost(GetType(WcfClient))
340
-
341
- Host.AddServiceEndpoint(
342
-
343
- GetType(IWcfClient),
344
-
345
- New NetNamedPipeBinding(NetNamedPipeSecurityMode.None),
346
-
347
- New Uri(Uri))
348
-
349
- Host.Open()
350
-
351
-
352
-
353
- InitializeComponent()
354
-
355
- End Sub
356
-
357
-
358
-
359
- ''' <summary>
360
-
361
- ''' テキストボックスに値をセットする
362
-
363
- ''' </summary>
364
-
365
- ''' <param name="text"></param>
366
-
367
- ''' <returns></returns>
368
-
369
283
  Public Function Reply(ByVal text As String) As String
370
284
 
371
285
       // テキストボックスにフォーム1より受け取った値をセット
372
286
 
373
287
  TextBox1.Text = text
374
288
 
375
-
376
-
377
289
  Return "Form2 Replyメソッドが呼ばれました"
378
290
 
379
291
  End Function
@@ -384,9 +296,173 @@
384
296
 
385
297
 
386
298
 
387
- ### 結果
388
-
389
- FaultExceptionのクトレース以下が力され
299
+ ### 内容
300
+
301
+ 「④サービスの具象クラス」を以下のようにFacadeを用い、呼び出すアセンブリ・クラ・メソドを動的指定来るように書き替え、Form1からForm2へプロセス間通信を実行しした
302
+
303
+ ```
304
+
305
+ [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
306
+
307
+ public class WcfClient: IWcfClient
308
+
309
+ {
310
+
311
+ public string CallExecute(string text)
312
+
313
+ {
314
+
315
+ // Facadeを用いてForm2のReplyメソッドをコール
316
+
317
+ return Facade<string>("Form2.exe", "Form2.MainWindow", "Reply", text);
318
+
319
+ }
320
+
321
+ private T Facade<T>(string assembly, string className, string methodName, string text = "")
322
+
323
+ {
324
+
325
+ string path = Environment.CurrentDirectory + @"\" + assembly;
326
+
327
+ Assembly asm = Assembly.LoadFrom(path);
328
+
329
+ object obj = asm.CreateInstance(className);
330
+
331
+ Type type = obj.GetType();
332
+
333
+ MethodInfo mi = type.GetMethod(methodName);
334
+
335
+ object[] param = new object[1];
336
+
337
+ param[0] = text;
338
+
339
+ object returnObj = mi.Invoke(obj, param);
340
+
341
+ return (T)returnObj;
342
+
343
+ }
344
+
345
+ }
346
+
347
+ }
348
+
349
+ ```
350
+
351
+ 上記を実行した結果、以下のスタックトレースが出力されました。
352
+
353
+ ```
354
+
355
+ System.ServiceModel.FaultException
356
+
357
+ HResult=0x80131501
358
+
359
+ Message=内部エラーのため、クライアントは要求を処理できませんでした。このエラーの詳細については、例外情報をクライアントに返信するためにサーバーで IncludeExceptionDetailInFaults を有効にするか (ServiceBehaviorAttribute または <serviceDebug> 構成動作を通じて)、Microsoft .NET Framework SDK ドキュメントに従ってトレースを有効にして、サーバーのトレース ログを調べてください。
360
+
361
+ Source=mscorlib
362
+
363
+ スタック トレース:
364
+
365
+ 場所 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
366
+
367
+ 場所 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
368
+
369
+ 場所 Form1.IWcfClient.CallExecute(String text)
370
+
371
+ 場所 Form1.MainWindow.Button_Click(Object sender, RoutedEventArgs e) (C:\workspace\20191020\WcfConnection\Form1\MainWindow.xaml.cs):行 34
372
+
373
+ 場所 System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
374
+
375
+ 場所 System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
376
+
377
+ 場所 System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
378
+
379
+ 場所 System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
380
+
381
+ 場所 System.Windows.Controls.Primitives.ButtonBase.OnClick()
382
+
383
+ 場所 System.Windows.Controls.Button.OnClick()
384
+
385
+ 場所 System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
386
+
387
+ 場所 System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
388
+
389
+ 場所 System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
390
+
391
+ 場所 System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
392
+
393
+ 場所 System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
394
+
395
+ 場所 System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
396
+
397
+ 場所 System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
398
+
399
+ 場所 System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
400
+
401
+ 場所 System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
402
+
403
+ 場所 System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
404
+
405
+ 場所 System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
406
+
407
+ 場所 System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
408
+
409
+ 場所 System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
410
+
411
+ 場所 System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
412
+
413
+ 場所 System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
414
+
415
+ 場所 System.Windows.Input.InputManager.ProcessStagingArea()
416
+
417
+ 場所 System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
418
+
419
+ 場所 System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
420
+
421
+ 場所 System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
422
+
423
+ 場所 System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
424
+
425
+ 場所 System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
426
+
427
+ 場所 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
428
+
429
+ 場所 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
430
+
431
+ 場所 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
432
+
433
+ 場所 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
434
+
435
+ 場所 System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
436
+
437
+ 場所 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
438
+
439
+ 場所 MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
440
+
441
+ 場所 System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
442
+
443
+ 場所 System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
444
+
445
+ 場所 System.Windows.Application.RunDispatcher(Object ignore)
446
+
447
+ 場所 System.Windows.Application.RunInternal(Window window)
448
+
449
+ 場所 System.Windows.Application.Run(Window window)
450
+
451
+ 場所 System.Windows.Application.Run()
452
+
453
+ 場所 Form1.App.Main()
454
+
455
+ ```
456
+
457
+ 調べたところ、FaultExceptionの実行例外の詳細をクライアント側で取得するためには⑤のようなデバッグ追跡用のデータクラスが必要であったため、「FailureInfoクラス」を新規作成しました。
458
+
459
+ そしてプロセス間通信の実行例外(FaultException)のスタックトレースを確認するため「④サービスの具象クラス」のように書き換えました。
460
+
461
+
462
+
463
+ ### 質問内容
464
+
465
+ 「④サービスの具象クラス」でFaultExceptionをスローし、プロセス間通信の実行例外のスタックトレースを確認した結果、以下が出力されました。
390
466
 
391
467
  自身で調査しましたが、真因が追求出来ていません。解決策をご存知の方いらっしゃいましたらご教授お願い致します。
392
468