原生 C/C++ 代码的 C++/CLI 包装器,无法在 Unity3D 中加载

Posted

技术标签:

【中文标题】原生 C/C++ 代码的 C++/CLI 包装器,无法在 Unity3D 中加载【英文标题】:C++/CLI wrapper for native C/C++ code, unable to load in Unity3D 【发布时间】:2011-03-15 14:37:57 【问题描述】:

我一直在网上寻找有关如何在 Unity3D 中加载程序集的信息,但我真的很难过。如果这篇文章会很长,我很抱歉,但我将把我学到的所有东西以及自从这是我第一次在 .net 和 dll 中工作以来我已经取得了多大的进步。

我有一个本机 dll,它有一大堆 extern "C",所以我可以在运行时加载所有内容。如果我使用 [DLLImport] 属性等,这将统一工作。但是,它很麻烦,而且不是真正可重用的代码。当我必须在多个本地库之间抽象我的系统时,以后会变得更加麻烦。

所以我想我会做一个 C++/CLI 包装器,然后像任何其他 dll 一样将它加载到 Unity3d 中,然后链接命名空间:“使用 MyWrapper;”

我创建了我能想到的最简单的 C++/CLI 库。我的库所做的只是有一个类(Class1),它有一个函数 int getnum() return 5;。我正在使用 VC++ 2010 express,并且正在使用 V90 构建,并将 vcxproj 文件修改为目标 2.0。我知道统一只支持 2.0。我正在 /clr 中构建,以便能够拥有本机和 .net 代码。

它完全使 unity3d 崩溃。 这是我的错误日志 在 Manager\GameManager.cs:116 中的 GameManager.Awake () [0x0001d] 在 Manager\GameManager.cs:107 中的 GameManager.Awake () [0x00000] 在(包装器运行时调用)GUIRadioButton.runtime_invoke_void(对象,intptr,intptr,intptr) 收到未处理的 NULL 异常

如果我在 /clr:safe 中构建它,它可以正常工作。 /clr:pure 也不行。

所以我决定做一个外部 c# 命令行项目来测试一切。我加载了我的库,并在 2.0 和 /clr(混合模式)中编译,没有问题。

我使用的是 Unity 2.6 Pro。

这可能是我想要做的事情是不可能的,我不知道.. 我的意思是我认为这就是 .NET 的全部意义所在。我只想拥有一个可以在其他项目中重复使用的系统(C++)。

感谢您的任何见解。

这是我的测试 c++/cli 项目。

#pragma once

using namespace System;

namespace CLRTest 

    public ref class Class1
    
        // TODO: Add your methods for this class here.
    public:

        Class1()

        int getnum ()return 5;
    ;

当我像这样创建一个 C# 命令行项目时。它有效。

using System;
using System.Collections.Generic;
using System.Text;
using CLRTest;

namespace CLRTestLoad

    class Program
    
        static void Main(string[] args)
        
            Class1 c = new Class1();

            Console.WriteLine ("num is = " + c.getnum());
        
    

在 Unity3d 中执行这一行会使整个编辑器崩溃。 (是的,我确实放入了 using 语句)

Class1 c = new Class1();

【问题讨论】:

邮政编码,不要描述你做什么。发布完整的 C++/CLI 类和使用该类的 C# 代码的 sn-p。 添加了代码。希望它有所帮助。 【参考方案1】:

AFAIK,C++/CLI 程序集不适用于 Unity,因为 Unity 依赖于不支持混合程序集的 Mono。唯一的解决方法是使用经典 p/invoke 从 dll 调用函数

【讨论】:

看来你是对的。这将解释它。我想我真的别无选择,只能使用 P/Invoke。这是参考。 Mono-CPPMono-FAQ 或者您可以围绕 CLR DLL 编写一个 C# 包装 DLL。

以上是关于原生 C/C++ 代码的 C++/CLI 包装器,无法在 Unity3D 中加载的主要内容,如果未能解决你的问题,请参考以下文章

在C ++ / CLI中通过包装器(派生的托管类)调用派生本机类的重写方法

如何为非托管 c dll 创建 c++\cli 包装器

在Visual Studio 2010中将Native / C ++ DLL链接到托管C ++ / CLI包装器

在 perl 中调试由 SWIG 包装的共享库

使用 C++/CLI 包装器将二维数组从 C# 传递到非托管 C++

通过 CLI 包装器在非托管 C++ 中使用 C#.NET Winform - 需要线程?