Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C++/用于本机C/C++;代码,无法在Unity3D中加载_C#_Dll_C++ Cli_Clr_Unity3d - Fatal编程技术网

C# C++/用于本机C/C++;代码,无法在Unity3D中加载

C# C++/用于本机C/C++;代码,无法在Unity3D中加载,c#,dll,c++-cli,clr,unity3d,C#,Dll,C++ Cli,Clr,Unity3d,我一直在网络上到处寻找如何在Unity3D中加载部件,我真的很难。如果这篇文章很长,我很抱歉,但我会把我学到的一切和我取得的成绩都放在这里,因为这是我第一次在.net和DLL中工作 我有一个本地dll,它有一大堆外部“C”,所以我可以在运行时加载所有内容。如果我使用[DLLImport]属性等,这在统一中起作用。然而,它很麻烦,并且不是真正可重用的代码。当我不得不在多个本机库之间抽象我的系统时,它会变得更加麻烦 所以我想我应该做一个C++/CLI包装,然后像其他任何dll一样在Unity3d中加

我一直在网络上到处寻找如何在Unity3D中加载部件,我真的很难。如果这篇文章很长,我很抱歉,但我会把我学到的一切和我取得的成绩都放在这里,因为这是我第一次在.net和DLL中工作

我有一个本地dll,它有一大堆外部“C”,所以我可以在运行时加载所有内容。如果我使用[DLLImport]属性等,这在统一中起作用。然而,它很麻烦,并且不是真正可重用的代码。当我不得不在多个本机库之间抽象我的系统时,它会变得更加麻烦

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

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

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

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

所以我决定做一个外部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;}
    };
}
当我创建这样的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中执行这一行会使整个编辑器崩溃。(是的,我确实填写了使用声明)


首先,C++/CLI程序集不能与Unity一起使用,因为Unity依赖于不支持混合程序集的Mono。唯一的解决方法是使用经典的p/invoke

Post代码从dll调用函数,不要描述您的操作。发布完整的C++/CLI类和使用该类的C#代码片段。添加的代码。希望能有帮助。看来你是对的。这就可以解释了。我想我真的没有选择,只能使用P/Invoke。这是参考资料。或者您可以围绕CLR DLL编写一个C#包装DLL。
Class1 c = new Class1();