我一直在寻找如何在Unity3D中加载组件的整个网络,而且我确实很难。很抱歉,如果这篇文章很长,但是我将把我学到的一切以及我走了多远,因为这是我第一次在.NET和DLL中工作。

我有一个本地DLL,它有一大堆外部“ C”,因此我可以在运行时加载所有内容。如果我使用[dllimport]属性等等,这会起作用。但是,这很麻烦,而且不是真正可重复使用的代码。稍后,当我必须在一个以上的本地库之间抽象系统时,它将变得更加麻烦。

因此,我认为我会做一个C +++/CLI包装器,然后像其他任何DLL一样将其加载到Unity3D中,然后将名称空间链接起来:“使用myWrapper;”

我创建了我能想到的最简单的C ++/CLI LIB。我所做的只是有一个类(class1),并且它具有一个函数int getnum(){return 5;}。我正在使用VC ++ 2010 Express,并使用V90构建,并将VCXPROJ文件修改为Target 2.0。我知道Unity仅支持2.0。我正在构建 /CLR,以便能够具有本机和.NET代码。

它完全崩溃了Unity3D。这是Manager GameManager.cs中的GameManager.awake()[0x0001d]上的我的错误登录:116在Manager GameManager.cs中的GameManager.awake()[0x00000]:107 at(Wrapper runtime-Invoke)guiradiobutton.runtton.runtime_invoke_invoke_voke_voke_vide(对象,intptr,intptr,intptr)<0xfffffffff>接收未手持的null异常

如果我在 /clr中构建它:安全起作用。 /clr:纯净也不起作用。

因此,我决定执行外部C#命令行项目以测试所有内容。我加载了我的lib,并以2.0和 /clr(混合模式)毫无问题地编译(混合模式)。

我正在使用Unity 2.6 Pro。

我想做的可能是不可能的。我只想拥有一个可以在其他项目(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中执行此行会使整个编辑器崩溃。 (是的,我确实提出了使用语句)

Class1 c = new Class1();
有帮助吗?

解决方案

AFAIK,C ++/CLI组件不与Unity合作,因为Unity依赖于不支持混合组件的单声道。唯一的解决方法是通过经典P/Invoke从DLL调用功能

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top