C++ DLL 和 C# Unity 之间的集成

Posted

技术标签:

【中文标题】C++ DLL 和 C# Unity 之间的集成【英文标题】:Integration between C++ DLL and C# Unity 【发布时间】:2017-05-02 17:01:18 【问题描述】:

我遇到了 C++ Dll 与 Unity 集成的问题。我在网上找到了一些代码(文章末尾的链接),但它不起作用。

这是我的 C++ DLL 代码(我想向统一发送一个包含一些要点的结构):

struct Pontos 
int i;
float f;
;
Pontos **pontos;
DllExport bool SetPoints(Pontos *** a, int *i)


    pontos = new Pontos*[4];
    for (int j = 0; j < 4; j++) 
            pontos[j] = new Pontos; // Actually create each object.
            pontos[j]->i = j;
            pontos[j]->f = (float)j;
        
        *a = pontos;
        *i = 4;
        return true;
    

从统一代码中,我得到以下错误:

文件中没有 MonoBehaviour 脚本,或者它们的名称与文件名不匹配

我不知道这是什么意思。 在这里,我尝试获取这些点并将它们保存在 c# 中:

[DllImport("dll")]
private static extern bool SetPoints(out IntPtr ptrResultVerts, out int resultVertLength);
public struct Pontos

    int i;
    float f;
;     
void Start()
 
    IntPtr ptrNativeData = IntPtr.Zero;
    int itemsLength = 0;

    bool success = SetPoints(out ptrNativeData, out itemsLength);
    if (!success)
    
        return;
    

    Pontos[] SArray = new Pontos[itemsLength];  // Where the final data will be stored.
    IntPtr[] SPointers = new IntPtr[itemsLength];

    Debug.Log("Length: " + itemsLength); // Works!
    Marshal.Copy(ptrNativeData, SPointers, 0, itemsLength); // Seems not to work.

    for (int i = 0; i < itemsLength; i++)
    
        Debug.Log("Pointer: " + SPointers[i]);
        SArray[i] = (Pontos)Marshal.PtrToStructure(SPointers[i], typeof(Pontos));
    

我从Can't marshal array of stucts from C++ to C# in Unity 得到这个代码。

【问题讨论】:

你忘了把[StructLayout(LayoutKind.Sequential),Serializable]放在public struct Pontos的顶部.... 仅在 c++ 中还是需要在 c# 中做其他事情? 阅读一些文章我发现Marshalling不需要序列化 当(行为)文件中的第一个类型不具有相同名称时,会出现“文件中没有 MonoBehaviour 脚本,或者它们的名称与文件名不匹配”,请尝试移动其他类型,例如 Pontos 到不同的文件。应该有魅力。 【参考方案1】:

您必须导入指定调用约定的 dll

[DllImport("MyDLL.dll", CallingConvention = CallingConvention.Cdecl)]

我不认为错误

文件中没有 MonoBehaviour 脚本,或者它们的名称与 文件名

与您的代码有任何关系。检查您的班级名称和脚本名称。它们对应吗?

最后,我不确定方法签名中的 out 修饰符,因为我从不需要在 C++ 端处理三重指针。如果您的目标是填充 Pontos 结构数组,那么您不需要它。

另见Pass structure (or class) from C++ dll to C# (Unity 3D)

【讨论】:

以上是关于C++ DLL 和 C# Unity 之间的集成的主要内容,如果未能解决你的问题,请参考以下文章

Unity中C#调用C++写的DLL之Swig篇

Unity C# Texture发送到C++ dll的方法 升级版

使用 C++ 和嵌入式单声道调用 C# DLL 时无法加载程序集系统

Unity与DLL(C++)☀️一[DLLImport]是 Unity 与 DLL 沟通的桥梁

在 Unity 中使用 DLL,MonoBehaviour

Unity与DLL(C++)☀️一Unity与DLL交互的意义