如何在Unity中使用不安全上下文

17

我希望在Unity中使用CLR将c++代码用于c#

该程序在Unity引擎外可以正常工作,但在引擎内部会出现错误:
"cs0227:不安全的代码需要指定'unsafe'命令行选项"

我很困惑,因为该项目在Visual Studio中成功构建(没有任何错误或警告)。 我已经启用了允许不安全代码按钮。

using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

public class newspawn_real : MonoBehaviour {
    void Start () {
        unsafe
        {
            fixed (int * p = &bam[0, 0, 0])
            {
                CppWrapper.CppWrapperClass controlCpp = new CppWrapper.CppWrapperClass();
                controlCpp.allocate_both();
                controlCpp.fill_both();
                controlCpp.fill_wrapper();
            }
        }
    }
    // ...
}

如果有什么不清楚的地方,请告诉我,我会进行更正。 - Davit Goderdzishvili
1
由于Unity是一个黑盒子,我们不知道在代码转换时支持哪些C#特性。粗略的猜测是不支持不安全的内容。您是否考虑过使用“Marshal”类方法? - aybe
你是指 DLL 导入吗? '[DllImport("C++ unitshi.dll")]' static extern int add(int a, int b);' - Davit Goderdzishvili
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - aybe
3个回答

39

在Unity中,您需要显式启用unsafe代码。您可以按照以下步骤操作:

1. 首先,将Api Compatibility Level更改为.NET 2.0 Subset

API Compatibility level

2. 在您的<Project Path>/Assets目录中创建一个名为smcs.rsp的文件,然后将-unsafe放入该文件中。保存并关闭该文件。

create smcs.rsp file

  • 关闭并重新打开Visual Studio和Unity Editor。
  • 两者都必须重新启动

值得注意的是,即使在执行此操作并重新启动Unity和Visual Studio之后,问题仍然存在,

  • smcs.rsp文件重命名为csc.rspgmcs.rspmcs.rsp

每次重启Unity Editor和Visual Studio,直到找到可运行的文件为止。有关要使用的文件名的详细信息,请参阅平台相关编译文档

这是一个简单的C#不安全代码示例,在进行以上操作后可以编译通过。

public class newspawn_real : MonoBehaviour
{
    unsafe static void SquarePtrParam(int* p)
    {
        *p *= *p;
    }

    void Start()
    {
        unsafe
        {
            int i = 5;
            // Unsafe method: uses address-of operator (&):
            SquarePtrParam(&i);
            Debug.Log(i);
        }
    }
}

10
非常感谢!这是地球上最好的论坛。 - Davit Goderdzishvili
值得注意的是,我们应该使用smcs.rsp(用于.Net 2.0子集)或gmcs.rsp(用于.Net 2.0)。 - Suraj S

6

更新: 在Unity 2019及以上版本中,我们不再有2.0子集。 请使用2.0标准版。

虽然mcs.rsp可以使用,但有一个警告提示mcs已过时,我们应该使用csc.rsp。

但实际上它确实有效!


1
请注意,您收到的错误可能会引导您走入歧途:
Assets\Foo\Foo.cs(832,13): error CS0227: 只有在使用 /unsafe 编译时,才能出现不安全代码。请在 'Assets/Game.asmdef' 的检查器中启用“允许不安全代码”以修复此错误。
尽管 Foo.cs 位于 Assets\Foo\Foo.asmdef 中,但显然需要设置开关的是那个文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接