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

回答編集履歴

3

修正

2020/12/29 08:15

投稿

退会済みユーザー
answer CHANGED
@@ -22,11 +22,7 @@
22
22
  public byte[] Data;
23
23
  };
24
24
 
25
- /// <summary>
26
- /// Dataを逆並びにするだけの関数
25
+ //Dataを逆並びにするだけの関数
27
- /// </summary>
28
- /// <param name="stIn">入力側構造体</param>
29
- /// <param name="stOut">出力側構造体</param>
30
26
  [DllImport("DllTest.dll", CallingConvention = CallingConvention.StdCall)]
31
27
  static extern void Test([In]ref STRUCT_CS stIn, [Out]out STRUCT_CS stOut);
32
28
 

2

サンプル追記

2020/12/29 08:15

投稿

退会済みユーザー
answer CHANGED
@@ -1,4 +1,92 @@
1
1
  構造体の宣言がC++側と合っていないですね。
2
2
  こちらが参考になるかもしれません。
3
3
  [uint配列を含む構造体の共有メモリへのマッピング](https://teratail.com/questions/302213)
4
- [ネイティブ相互運用性](https://docs.microsoft.com/ja-jp/dotnet/standard/native-interop/)
4
+ [ネイティブ相互運用性](https://docs.microsoft.com/ja-jp/dotnet/standard/native-interop/)
5
+
6
+ ---
7
+
8
+ 苦戦されているようなので、簡単なサンプルを追記します。
9
+ ```CS
10
+ using System;
11
+ using System.Diagnostics;
12
+ using System.Runtime.InteropServices;
13
+
14
+ namespace ConsoleApp1
15
+ {
16
+ class Program
17
+ {
18
+ [StructLayout(LayoutKind.Sequential)]
19
+ public struct STRUCT_CS
20
+ {
21
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
22
+ public byte[] Data;
23
+ };
24
+
25
+ /// <summary>
26
+ /// Dataを逆並びにするだけの関数。
27
+ /// </summary>
28
+ /// <param name="stIn">入力側構造体</param>
29
+ /// <param name="stOut">出力側構造体</param>
30
+ [DllImport("DllTest.dll", CallingConvention = CallingConvention.StdCall)]
31
+ static extern void Test([In]ref STRUCT_CS stIn, [Out]out STRUCT_CS stOut);
32
+
33
+ static void Main(string[] args)
34
+ {
35
+ try
36
+ {
37
+ var stIn = new STRUCT_CS();
38
+ var stOut = new STRUCT_CS();
39
+
40
+ //入力側構造体に0-9をセット
41
+ stIn.Data = new byte[10];
42
+ for (var i = 0; i < stIn.Data.Length; i++)
43
+ {
44
+ stIn.Data[i] = (byte)i;
45
+ }
46
+
47
+ //入力側の内容を逆並びにする
48
+ Test(ref stIn, out stOut);
49
+
50
+ //出力側構造体の中身を表示
51
+ for (var i = 0; i < stOut.Data.Length; i++)
52
+ {
53
+ Console.WriteLine(stOut.Data[i]);
54
+ }
55
+ }
56
+ catch (Exception ex)
57
+ {
58
+ Debug.WriteLine(ex.ToString());
59
+ }
60
+
61
+ Console.ReadLine();
62
+ }
63
+ }
64
+ }
65
+
66
+ (実行結果)
67
+ 9
68
+ 8
69
+ 7
70
+ 6
71
+ 5
72
+ 4
73
+ 3
74
+ 2
75
+ 1
76
+ 0
77
+ ```
78
+
79
+ 一応DLL側も
80
+ ```C++
81
+ typedef struct {
82
+ unsigned char Data[10];
83
+ } STRUCT_CPP;
84
+
85
+ extern void __stdcall Test(STRUCT_CPP* pstIn, STRUCT_CPP* pstOut)
86
+ {
87
+ for (int i=0; i<10; i++)
88
+ {
89
+ pstOut->Data[9-i] = pstIn->Data[i];
90
+ }
91
+ }
92
+ ```

1

追記

2020/12/29 07:41

投稿

退会済みユーザー
answer CHANGED
@@ -1,2 +1,4 @@
1
+ 構造体の宣言がC++側と合っていないですね。
1
2
  こちらが参考になるかもしれません。
2
- [uint配列を含む構造体の共有メモリへのマッピング](https://teratail.com/questions/302213)
3
+ [uint配列を含む構造体の共有メモリへのマッピング](https://teratail.com/questions/302213)
4
+ [ネイティブ相互運用性](https://docs.microsoft.com/ja-jp/dotnet/standard/native-interop/)