回答編集履歴

3

CriticalFinalizerObject を継承すると動かなかった

2020/05/16 01:18

投稿

KOZ6.0
KOZ6.0

スコア2707

test CHANGED
@@ -110,7 +110,7 @@
110
110
 
111
111
  [StructLayout(LayoutKind.Sequential)]
112
112
 
113
- public unsafe class Example2 : CriticalFinalizerObject
113
+ public unsafe class Example2
114
114
 
115
115
  {
116
116
 

2

CriticalFinalizerObject の継承し忘れ

2020/05/16 01:18

投稿

KOZ6.0
KOZ6.0

スコア2707

test CHANGED
@@ -110,7 +110,7 @@
110
110
 
111
111
  [StructLayout(LayoutKind.Sequential)]
112
112
 
113
- public unsafe class Example2
113
+ public unsafe class Example2 : CriticalFinalizerObject
114
114
 
115
115
  {
116
116
 

1

GCHandle.Alloc を使った方法を追記

2020/05/16 01:13

投稿

KOZ6.0
KOZ6.0

スコア2707

test CHANGED
@@ -1,4 +1,4 @@
1
- アドレスを外部に公開したいということなら、こんな感じですかね。
1
+ ポインタを外部に公開したいということなら、こんな感じですかね。
2
2
 
3
3
 
4
4
 
@@ -97,3 +97,81 @@
97
97
  }
98
98
 
99
99
  ```
100
+
101
+ #追記
102
+
103
+
104
+
105
+ 何がなんでも変数のポインタを公開したいということであれば GC の移動対象外にする必要があるので、GCHandle.Alloc でクラスをピン止めしてください。
106
+
107
+
108
+
109
+ ```C#
110
+
111
+ [StructLayout(LayoutKind.Sequential)]
112
+
113
+ public unsafe class Example2
114
+
115
+ {
116
+
117
+ int buff;
118
+
119
+ GCHandle gch;
120
+
121
+
122
+
123
+ public Example2() {
124
+
125
+ gch = GCHandle.Alloc(this, GCHandleType.Pinned);
126
+
127
+ }
128
+
129
+
130
+
131
+ ~Example2()
132
+
133
+ {
134
+
135
+ gch.Free();
136
+
137
+ }
138
+
139
+
140
+
141
+ public int* Buffer {
142
+
143
+ get {
144
+
145
+ fixed (int* ptr = &buff) {
146
+
147
+ return ptr;
148
+
149
+ }
150
+
151
+ }
152
+
153
+ }
154
+
155
+
156
+
157
+ public int Value {
158
+
159
+ get {
160
+
161
+ return buff;
162
+
163
+ }
164
+
165
+ set {
166
+
167
+ buff = value;
168
+
169
+ }
170
+
171
+ }
172
+
173
+ }
174
+
175
+
176
+
177
+ ```