Это мой первый пост (после долгих лет).
Проект, которым я буду заниматься, — это использование файлов NetCDF4 (.nc) в Unity на Windows. Я буду использовать Unity 5.4.0f3 и Windows 10, и я разрабатывал в Unity раньше и знаком с C # и JavaScript, но NetCDF имеет только API C, Java и Fortran, хотя есть обертки в Python, C ++ и других. (источник: https://www.unidata.ucar.edu/publications/factsheets/current/factsheet_netcdf.pdf).
Так что мой конкретный вопрос как вызвать функции NetCDF4-C (nc_get_vara_float (), nc_open и т. д.) в C # для использования в Unity?
Что я пробовал до сих пор:
Вначале я специально гуглил учебники / попытки по NetCDF4-C + Unity, но ничего не нашел, поэтому вместо этого я искал совместимость вызова функций C из C #. В настоящее время я работаю над проектом для Linux с NetCDF4-C и написал пользовательские функции-оболочки для функций netcdf.h, поэтому я надеялся, что смогу повторно использовать свой код там.
Я попытался подписаться на этот ТАК пост (Можно ли вызвать функцию C из C # .Net) но при попытке воспроизведения выдается ошибка в Unity: «DllNotFoundException: test.so» (мой файл назывался «test.c»). Судя по комментариям, Linux использует .so файлы, но Windows использует .dll, и я не был уверен, как сгенерировать .dll из файла C.
Я посмотрел еще один пост на этом (Как написать файл DLL в C?) и скачал Visual Studio, чтобы следовать. Пока VS скачивал, я посмотрел, как использовать GCC для компиляции (Создание DLL в GCC или Cygwin?), и использовал подсистему Bash (терминал «Bash на Ubuntu в Windows»), но получил несколько ошибок, которые указывали на то, что код из предыдущей ссылки (2-я ссылка SO в этом посте) был для C ++, поэтому я перестал работать с GCC.
Как только VS закончил установку, я вернулся к попытке использовать VS для создания .dll и попытался объединить решения из обеих публикаций SO (1 и 2), чтобы я мог использовать DLL-файл, содержащий код C в Единство, но безрезультатно: я получаю ту же ошибку, но только с другим расширением (и с другим именем): «DllNotFoundException: Win32Project1.dll».
У меня есть следующий код:
test.cs (используется в Unity и присоединяется к компоненту):
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
public class test : MonoBehaviour {
[DllImport("Win32Project1.dll", EntryPoint="DisplayHelloFromMyDLL")]
public static extern void DisplayHelloFromMyDLL ();
// Use this for initialization
void Start () {
DisplayHelloFromMyDLL();
}
// Update is called once per frame
void Update () {
}
}
Win32Project1.dll (создан и встроен в Visual Studio):
#include <stdio.h>
extern "C"{
__declspec(dllexport) void DisplayHelloFromMyDLL()
{
printf("Hello DLL.\n");
}
}
Задача ещё не решена.
Других решений пока нет …