C# 构建C++;统一插件

C# 构建C++;统一插件,c#,c++,unity3d,dll,C#,C++,Unity3d,Dll,尝试创建我的第一个插件。 cpp代码为: 标题: #pragma once #ifndef __MY_DLL_H #define __MY_DLL_H extern "C" int add_1(int number); #endif 资料来源: //FirstDLL.cpp #include "FirstDLL.h" extern "C" int add_1(int number) { return number + 1; } 然后我编译并将DLL放入Assets/Plugin

尝试创建我的第一个插件。 cpp代码为:

标题:

#pragma once
#ifndef __MY_DLL_H
#define __MY_DLL_H

extern "C" int add_1(int number);

#endif
资料来源:

//FirstDLL.cpp
#include "FirstDLL.h"

extern "C" int add_1(int number) {
    return number + 1;
}
然后我编译并将DLL放入
Assets/Plugins
文件夹,DLL文件是
FirstDLL.DLL
。从unity方面来看,我有一个简单的组件C#脚本:

using UnityEngine;

public class MyBehaviour : MonoBehaviour {

    // Use this for initialization
    [Header("Nuts!")]
    public int my_curr_val;
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        print(add_1(my_curr_val));
    }

    [DllImport("FirstDLL")]
    public static extern int add_1(int number);
}
但当我尝试运行脚本时,会出现以下错误:

插件:加载“Assets/Plugins/FirstDLL.dll”失败,出现错误 '此操作仅在应用程序容器的上下文中有效。 '. 插件:加载“Assets/Plugins/FirstDLL.dll”失败,错误为“此操作仅在应用程序容器的上下文中有效”。 '. DllNotFoundException:FirstDLL mybehavior.Update()(位于Assets/mybehavior.cs:17)

文档似乎很差,有什么建议吗?
有,但不确定我做错了什么。我已经尝试创建了几个解决方案(windows universal platform、windows 8.1等)仍然不起作用。

您试图在非UWP环境中加载UWP插件,这是因为您构建dll的方式

此篇文章描述了如何在Unity中创建、编译和编译C++插件。 用于此目的的软件版本(也适用于其他旧版本。仅在将来有更新和不同的UI时提及此信息):

  • Microsoft Visual Studio 2015

  • Unity 2017.2.0f3

1。转到文件-->新建-->项目

2。转到安装->模板--> Visual C++ + Win32控制台应用程序。键入项目的名称,然后单击“确定”

3。单击“下一步”而不是“完成”:

4。选择DLL并取消选择预编译头,然后单击“完成”:

5。您现在可以创建源(.cpp)和头(.h)文件

A。创建源文件:

这应该放在源文件文件夹中。右键单击源文件-->添加-->新项目

<强> b。选择C++文件(.CPP),键入文件“FieldLL.CPP”的名称,然后单击Add。

示例C++测试源:

#include "FirstDLL.h"

int add(int num1, int num2)
{
    return num1 + num2;
}

int multiply(int num1, int num2)
{
    return num1 * num2;
}

int substract(int num1, int num2)
{
    return num1 - num2;
}

int divide(int num1, int num2)
{
    return num1 / num2;
}

A。创建头文件:

这应该放在头文件文件夹中。右键单击头文件-->添加-->新项目

B。选择头文件(.h),键入文件名“FirstDLL.h”,然后单击添加

对应标题的示例:

#ifndef FIRSTDLL_NATIVE_LIB_H
#define FIRSTDLL_NATIVE_LIB_H

#define DLLExport __declspec(dllexport)

extern "C"
{
    DLLExport int add(int num1, int num2);
    DLLExport int multiply(int num1, int num2);
    DLLExport int substract(int num1, int num2);
    DLLExport int divide(int num1, int num2);
}
#endif
就这样。现在可以在那里编写C++插件代码。 6。确保将构建设置为release,并将平台设置为64位

如果使用32位,请将平台设置为x86

7。构建插件:

转到构建-->构建解决方案

8。导入Unity:

PC、Mac和Linux单机版

将64位dll文件放入
Assets/Plugins
文件夹

如果您只想支持32位,请将插件放入
Assets/Plugins/x86

如果您想支持universal(32位和64位平台),那么构建dll并将其放入
Assets/Plugins/x86_64
文件夹中

安卓系统

可以从构建

要从Visual Studio生成,请执行以下操作:

A。转到文件-->新建-->项目

B。转到安装->模板-> Visual C++,然后跨平台。点击安装Android支持C++(更新X)。然后按照说明安装

C。转到安装->模板-> Visual C++ ->跨平台。然后是安卓。选择Dynamic Shard Library(Android),然后键入项目名称并单击Ok。现在,您可以跳回步骤<强> 5×<强>继续在C++中进行编码。

将Android插件文件(不是dll)放入
Assets/Plugins/Android
文件夹。 支持的C++插件扩展<代码>。所以 ./P> 注意:如果Android插件的名称是
libFirstDLL lib.so
,那么从C#中引用它时,请删除
lib
前缀和
.so
。在这种情况下,它将是
[DllImport(“FirstDLL”)]
,而不是#9中的

如果您同时拥有
armeabi-v7a
x86
Android
。那么
插件将分别放入
Assets\plugins\Android\libs\armeabi-v7a
Assets\plugins\Android\libs\x86
文件夹中

iOS

可以从构建,也可以将源文件包含到Unity中。您也可以使用VisualStudio创建它。只需遵循Android的步骤,但使用安装iOS支持C++(更新X),而不是安装Android支持C++(更新X)。请注意,您需要Mac计算机为iOS构建或使用虚拟机。完成此操作后,请按照Microsoft说明完成安装,以便Visual Studio可以在Mac OS上进行通信并构建项目

将iOS插件文件(不是dll)放入
Assets/Plugins/iOS
文件夹。支持的插件扩展有
.a
.m
.mm
.c
.cpp

必须使用
[DllImport(“\uu Internal”)]
而不是
[DllImport(“PluginName”)]
[DllImport(“FirstDLL”)]
,如下所示\9

<强> 9 < /强>调用CUng+C函数:

C++函数 输出


10。插件错误疑难解答:

1。获取错误:

DllNotFoundException:

解决方案1:

DllImport
中指定的DLL名称与DLL名称不匹配。通过重命名它们来确保它们匹配,然后重新启动Unity

[DllImport("FirstDLL")] public static extern int add(int num1, int num2); [DllImport("FirstDLL")] public static extern int multiply(int num1, int num2); [DllImport("FirstDLL")] public static extern int substract(int num1, int num2); [DllImport("FirstDLL")] public static extern int divide(int num1, int num2); void Start() { Debug.Log("Add: " + add(10, 2)); Debug.Log("Multiply: " + multiply(10, 2)); Debug.Log("Substract: " + substract(10, 2)); Debug.Log("Divide: " + divide(10, 2)); }