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