用于本机C/C++代码的C++/CLI包装器,无法在Unity3D中加载

Edg*_*nte 6 c# dll clr c++-cli unity-game-engine

我一直在寻找并在网上查看如何在Unity3D中加载程序集,我真的很难过.我很抱歉,如果这篇文章很长,但我会把我学到的所有内容和我已经学到的东西,因为这是我第一次在.net和dll工作.

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

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

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

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

如果我在/ clr:safe中构建它,那么它可以正常工作./ clr:纯也不起作用.

所以我决定做一个外部的c#命令行项目来测试一切.我加载我的lib,并在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;}
    };
}
Run Code Online (Sandbox Code Playgroud)

当我像这样创建一个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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Unity3d中执行此行会导致整个编辑器崩溃.(是的,我确实加入了使用声明)

Class1 c = new Class1();
Run Code Online (Sandbox Code Playgroud)

小智 6

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