回答編集履歴

2

追記

2018/03/19 05:42

投稿

catsforepaw
catsforepaw

スコア5938

test CHANGED
@@ -24,6 +24,30 @@
24
24
 
25
25
 
26
26
 
27
- ↑に書いた内容はWindowsのDLLの場合ですね。元記事をもう少し読み進めていったら、.soファイルとか書いてあるのでLinuxかMacということでしょう。となると、バージョン不整合は問題になるかもしれません。
27
+ ↑に書いた内容はWindowsのDLLの場合ですね。元記事をもう少し読み進めていったら、.soファイルとか書いてあるのでLinuxかMacということでしょう。となると、バージョン不整合は問題になるかもしれません。
28
28
 
29
29
  まぁ、そうだとしても、コンパイラーのバージョンが変わったらリビルドすれば良いだけなので、STLを使ってはいけないという縛りをあえて設ける必要なないと思います。
30
+
31
+
32
+
33
+ ---
34
+
35
+ 追記
36
+
37
+
38
+
39
+ 肝心なことを忘れていました。
40
+
41
+
42
+
43
+ > いざ、作成した dll を Unity 上で利用しようとすると、「std::map の count() で、そのキーが存在しているにもかかわらずカウントされない」とか、「std::for_each の処理に差し掛かったら落ちる」などあり、正常に動作しません。
44
+
45
+
46
+
47
+ テストアプリというのはC#で作ったのでしょうか? なるべく利用環境に近い状態でテストする必要があります
48
+
49
+ エクスポート関数の引数などにコンテナが含まれていませんか? 前述の通り、C#のDllImportで呼べるのはC形式の関数のみです。
50
+
51
+
52
+
53
+ 実際のところ、どのように作ってどのように呼んでいるのかが判らないので、なんとも答えようがありません。可能であればソースコードを提示していただければ、もう少し適切に回答できるかもしれません。

1

補足

2018/03/19 05:42

投稿

catsforepaw
catsforepaw

スコア5938

test CHANGED
@@ -10,8 +10,20 @@
10
10
 
11
11
 
12
12
 
13
- 一方、Unity(というかC#)に関しては、DLLを動的リンクする方式なので、インターフェイス部分(関数プロトタイプ)さえきっちり決められていれば、中身をどう書こうと自由です。STLを使っても良いですし、boostのような外部ライブラリーを使っても何の問題もありません。たとえコンパイラーのバージョンが違っていても(ほとんどの場合)問題にはなりません。
13
+ 一方、Unity(というかC#)に関しては、DLLを動的リンクする方式なので、インターフェイス部分(関数プロトタイプ)さえきっちり決められていれば、中身をどう書こうと自由です。STLを使っても良いですし、boostのような外部ライブラリーを使っても何の問題もありません。たとえコンパイラーのバージョンが違っていても(基本的には)問題にはなりません。
14
14
 
15
15
 
16
16
 
17
- ただし、C#のDllInportの場合「C形式の関数」しか対応していないので、引数や戻り値にSTLコンテナを使うことはできません。それが制限といえば制限かもしれませんね。そのため、中身はクラスで実装するけど、C#向けにはC形式のラッパー関数を作ってそれをエクスポートする、ということをよくやります。
17
+ ただし、C#のDllInportの場合「C形式の関数」しか対応していないので、引数にSTLコンテナを使うようなことはできません。それが制限といえば制限かもしれませんね。そのため、中身はクラスで実装するけど、C#向けにはC形式のラッパー関数を作ってそれをエクスポートする、ということをよくやります。
18
+
19
+
20
+
21
+ ---
22
+
23
+ 補足
24
+
25
+
26
+
27
+ ↑に書いた内容はWindowsのDLLの場合ですね。元記事をもう少し読み進めていったら、.soファイルとか書いてあるのでLinuxかMacということでしょうか。となると、バージョン不整合は問題になるかもしれません。
28
+
29
+ まぁ、そうだとしても、コンパイラーのバージョンが変わったらリビルドすれば良いだけなので、STLを使ってはいけないという縛りをあえて設ける必要なないと思います。