回答編集履歴

1

C#のコードを追加しました

2018/03/27 00:08

投稿

naohiro19_
naohiro19_

スコア178

test CHANGED
@@ -322,4 +322,312 @@
322
322
 
323
323
 
324
324
 
325
- あとは「共通言語ランタイム サポート (/clr)」「ダイナミック ライブラリ (.dll)」の設定への変更とスタティックライブラリへのパスを設定してビルドすればC#からでもVB/F#からでもこのcounterクラスを呼び出すことができます
325
+ あとは「共通言語ランタイム サポート (/clr)」「ダイナミック ライブラリ (.dll)」の設定への変更とスタティックライブラリへのパスを設定してビルドすればC#からでもVB/F#からでもこのcounterクラスを呼び出すことができます
326
+
327
+
328
+
329
+ ILSpyというツールを使ってCounterを解析すると以下のようなC#のコードが生成されています。
330
+
331
+ ```cs
332
+
333
+ using System;
334
+
335
+ using System.Runtime.ExceptionServices;
336
+
337
+ using System.Runtime.InteropServices;
338
+
339
+
340
+
341
+ namespace CounterLib
342
+
343
+ {
344
+
345
+ public class Counter : ICppInstance, IDisposable
346
+
347
+ {
348
+
349
+ private unsafe counter* <backing_store>NativePtr;
350
+
351
+
352
+
353
+ protected bool __ownsNativeInstance;
354
+
355
+
356
+
357
+ public int Value
358
+
359
+ {
360
+
361
+ get
362
+
363
+ {
364
+
365
+ return <Module>.counter.value(this.<backing_store>NativePtr);
366
+
367
+ }
368
+
369
+ }
370
+
371
+
372
+
373
+ public unsafe virtual IntPtr __Instance
374
+
375
+ {
376
+
377
+ get
378
+
379
+ {
380
+
381
+ IntPtr result = new IntPtr((void*)this.<backing_store>NativePtr);
382
+
383
+ return result;
384
+
385
+ }
386
+
387
+ set
388
+
389
+ {
390
+
391
+ this.<backing_store>NativePtr = (counter*)value.ToPointer();
392
+
393
+ }
394
+
395
+ }
396
+
397
+
398
+
399
+ public unsafe counter* NativePtr
400
+
401
+ {
402
+
403
+ get
404
+
405
+ {
406
+
407
+ return this.<backing_store>NativePtr;
408
+
409
+ }
410
+
411
+ set
412
+
413
+ {
414
+
415
+ this.<backing_store>NativePtr = value;
416
+
417
+ }
418
+
419
+ }
420
+
421
+
422
+
423
+ public unsafe Counter(Counter _0)
424
+
425
+ {
426
+
427
+ this.__ownsNativeInstance = true;
428
+
429
+ if (object.ReferenceEquals(_0, null))
430
+
431
+ {
432
+
433
+ throw new ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
434
+
435
+ }
436
+
437
+ counter* ptr = _0.<backing_store>NativePtr;
438
+
439
+ counter* ptr2 = <Module>.@new(4u);
440
+
441
+ counter* ptr3;
442
+
443
+ if (ptr2 != null)
444
+
445
+ {
446
+
447
+ cpblk(ptr2, ptr, 4);
448
+
449
+ ptr3 = ptr2;
450
+
451
+ }
452
+
453
+ else
454
+
455
+ {
456
+
457
+ ptr3 = null;
458
+
459
+ }
460
+
461
+ this.<backing_store>NativePtr = ptr3;
462
+
463
+ }
464
+
465
+
466
+
467
+ public unsafe Counter()
468
+
469
+ {
470
+
471
+ this.__ownsNativeInstance = true;
472
+
473
+ counter* ptr = <Module>.@new(4u);
474
+
475
+ counter* ptr2;
476
+
477
+ try
478
+
479
+ {
480
+
481
+ if (ptr != null)
482
+
483
+ {
484
+
485
+ ptr2 = <Module>.counter.{ctor}(ptr);
486
+
487
+ }
488
+
489
+ else
490
+
491
+ {
492
+
493
+ ptr2 = 0;
494
+
495
+ }
496
+
497
+ }
498
+
499
+ catch
500
+
501
+ {
502
+
503
+ <Module>.delete((void*)ptr, 4u);
504
+
505
+ throw;
506
+
507
+ }
508
+
509
+ this.<backing_store>NativePtr = ptr2;
510
+
511
+ }
512
+
513
+
514
+
515
+ public unsafe Counter(counter* native)
516
+
517
+ {
518
+
519
+ this.__ownsNativeInstance = false;
520
+
521
+ base..ctor();
522
+
523
+ this.<backing_store>NativePtr = native;
524
+
525
+ }
526
+
527
+
528
+
529
+ public unsafe static Counter __CreateInstance(IntPtr native)
530
+
531
+ {
532
+
533
+ return new Counter((counter*)native.ToPointer());
534
+
535
+ }
536
+
537
+
538
+
539
+ private unsafe void ~Counter()
540
+
541
+ {
542
+
543
+ <Module>.delete((void*)this.<backing_store>NativePtr, 4u);
544
+
545
+ }
546
+
547
+
548
+
549
+ private unsafe void !Counter()
550
+
551
+ {
552
+
553
+ <Module>.delete((void*)this.<backing_store>NativePtr, 4u);
554
+
555
+ }
556
+
557
+
558
+
559
+ public void Increment()
560
+
561
+ {
562
+
563
+ <Module>.counter.increment(this.<backing_store>NativePtr);
564
+
565
+ }
566
+
567
+
568
+
569
+ [HandleProcessCorruptedStateExceptions]
570
+
571
+ protected unsafe virtual void Dispose([MarshalAs(UnmanagedType.U1)] bool A_0)
572
+
573
+ {
574
+
575
+ if (A_0)
576
+
577
+ {
578
+
579
+ <Module>.delete((void*)this.<backing_store>NativePtr, 4u);
580
+
581
+ }
582
+
583
+ else
584
+
585
+ {
586
+
587
+ try
588
+
589
+ {
590
+
591
+ this.!Counter();
592
+
593
+ }
594
+
595
+ finally
596
+
597
+ {
598
+
599
+ base.Finalize();
600
+
601
+ }
602
+
603
+ }
604
+
605
+ }
606
+
607
+
608
+
609
+ public sealed override void Dispose()
610
+
611
+ {
612
+
613
+ this.Dispose(true);
614
+
615
+ GC.SuppressFinalize(this);
616
+
617
+ }
618
+
619
+
620
+
621
+ protected override void Finalize()
622
+
623
+ {
624
+
625
+ this.Dispose(false);
626
+
627
+ }
628
+
629
+ }
630
+
631
+ }
632
+
633
+ ```