如何使用不安全的代码Unity

时间:2016-08-24 19:59:03

标签: c# c++ unity3d clr unsafe

我想在c#中使用c ++代码来实现使用CLR的统一。

  

该程序在统一之外正常工作,但在引擎内部它给了我一个错误:
  " cs0227:不安全的代码需要“不安全的”#39;要指定的命令行选项"

我真的很困惑,因为该项目在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();
}

2 个答案:

答案 0 :(得分:22)

您必须在Unity中明确启用unsafe代码。您可以按照以下步骤操作:

<强> 1 即可。第一步,将 Api兼容级别更改为 .NET 2.0子集

enter image description here

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

enter image description here

关闭并重新打开Visual Studio和Unity。 您必须重新启动它们

值得注意的是,即使这样做并重新启动Unity和Visual Studio但问题仍然存在,rename smcs.rsp 文件到< strong> csc.rsp ,或 gmcs.rsp ,每次重新启动,直到找到有效的方式。虽然, smcs.rsp 应该是第一次这样做。

在此之后编译的简单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);
        }
    }
}

修改

对于最新的Unity版本,文件名应为 mcs.rsp 。其他一切都是一样的。

答案 1 :(得分:1)

更新: 在 unity 2019 及以后,我们没有 2.0 子集。 使用 2.0 标准。

虽然 mcs.rsp 有效,但有一条警告指出 mcs 已过时,我们应该改用 csc.rsp。

但它确实有效!