gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:36:24 26 4
gpt4 key购买 nike

我一直在网上寻找如何在 Unity3D 中加载程序集,但我真的很难过。如果这篇文章很长,我很抱歉,但我会把我所学到的一切和我所取得的进展都放在一起,因为这是我第一次在 .net 和 dll 中工作。

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

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

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

它完全崩溃了 unity3d。这是我的错误日志 在 GameManager.Awake () [0x0001d] 在 Manager\GameManager.cs:116 在 GameManager.Awake () [0x00000] 在 Manager\GameManager.cs:107 在(包装器运行时调用)GUIRadioButton.runtime_invoke_void(对象,intptr,intptr,intptr)<0xffffffff>接收未处理的 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 程序集无法与 Unity 一起使用,因为 Unity 依赖于不支持混合程序集的 Mono。唯一的解决方法是使用经典的 p/invoke 从 dll 调用函数

关于c# - 原生 C/C++ 代码的 C++/CLI 包装器,无法在 Unity3D 中加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5313351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com