Как передать параметры нативному плагину из C # (Unity)? - PullRequest
0 голосов
/ 30 октября 2018

C ++ код:

#include "stdafx.h"

class myClass
 {
  __declspec(dllexport) float addMyNum(float a)
   {
     return(a);
   }
};

Приведенный выше код скомпилирован в Trail.dll и помещен в папку плагинов проекта Unity.

код Unity C #:

using UnityEngine;
using System.Runtime.InteropServices;


public class ndstryscript : MonoBehaviour {

 [DllImport("Trial", EntryPoint = "?addMyNum@myClass@@AEAAMPEAM@Z")]

 private static extern float addMyNum(float a);

 void Start ()
  {
    float b = addMyNum(20);
    Debug.Log(b);
  }

}

enter image description here

Ожидаемый результат - 20, но я всегда получаю 0. Может ли кто-нибудь помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 30 октября 2018

На стороне C ++ вы должны вывести функцию addMyNum из класса myClass. Это должно исправить вашу функцию возврата 0 проблемы.

Другая причина, которая может вызвать эту проблему, - это количество параметров, не совпадающее между функциями C ++ и C #. Например, когда у вас есть это на стороне C ++:

DLLExport int add(int num1, int num2){ return ...}

но это на стороне C #:

[DllImport("FirstDLL")]
public static extern int add(int num1);

Вы получите неопределенное поведение с этим. Результат будет случайным, потому что функция на стороне C # имеет один параметр, а функция на C ++ - два.


Не связано, но использование EntryPoint = "?addMyNum@myClass@@AEAAMPEAM@Z" действительно выглядит странно. Иногда это необходимо, но иногда это не так, как вам нужно будет найти имя функции и сопоставить его с тем, что вам нужно для вызова на стороне C #. Вы можете просто поместить свою функцию C ++ в extern "C", и она будет гарантировать, что компилятор не изменит имя функции.

extern "C"
{
    __declspec(dllexport) float addMyNum(float a)
    {
        return(a);
    }
}

Тогда ваша сторона C #:

[DllImport("Trial")]
public static extern float addMyNum(float a);
...