web-dev-qa-db-ja.com

安全でないコードの使用方法Unity

CLRを使用して統一するためにc#でc ++コードを使用したいと思います。

プログラムはユニティの外では正しく動作しますが、エンジンの内部ではエラーが発生します。
"cs0227:安全でないコードでは、「安全でない」コマンドラインオプションを指定する必要があります"

プロジェクトはVisualStudioで正常にビルドされるため(エラーや警告なしで)、私は本当に混乱しています。 "allownsafe"ボタンがアクティブになっています。

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();
}

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とVisualStudioの両方を再起動した後でも、問題は解決しないことに注意してください 名前の変更smcs.rspファイルから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である必要があります。他のすべては同じままです。

29
Programmer