How to use unsafe context in Unity
Solution 1
You have to explicitly enable unsafe
code in Unity. You can follow the steps below:
1. First step, Change Api Compatibility Level to .NET 2.0 Subset.
2. Create a file in your <Project Path>/Assets
directory and name it smcs.rsp
then put -unsafe
inside that file. Save and close that file.
- Close and reopen Visual Studio and Unity Editor.
- You must restart both of them.
It's worth noting that even after doing this and restarting both Unity and Visual Studio, if the problem is still there,
- Rename the
smcs.rsp
file tocsc.rsp
,gmcs.rsp
ormcs.rsp
Restart Unity Editor and Visual Studio each time until you get one that works. For more details about the file name to use, refer to Platform Dependent Compilation documentation.
Simple C# unsafe code that compiles after this.
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);
}
}
}
Solution 2
update: on unity 2019 and forward, we don't have the 2.0 subset. use 2.0 Standard.
and although mcs.rsp works, there is a warning noting that mcs is obsolete, and we should use csc.rsp instead.
but it actually works !
Davit Goderdzishvili
Updated on December 08, 2021Comments
-
Davit Goderdzishvili over 2 years
I want to use
c++ code
inc#
for Unity using CLR.The program works properly outside of unity, but inside of engine it gives me an error:
"cs0227: unsafe code requires the 'unsafe' command line option to be specified"I am really confused, because the project builds successfully in visual studio (without any errors or warnings). I have "allow unsafe" button activated.
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 almost 8 yearsthank you very much! this is the best forum on earth.
-
Suraj S over 4 yearsIt's worth noting that we should use smcs.rsp (for .Net 2.0 Subset) or gmcs.rsp (for .Net 2.0)