如何在 Unity 中使用不安全上下文
How to use unsafe context in Unity
我想在 c#
中为使用 CLR 的 Unity 使用 c++ code
。
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"
我真的很困惑,因为项目在 visual studio 中成功构建(没有任何错误或警告)。我激活了“allow unsafe”按钮。
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 子集.
2。在 <Project Path>/Assets
目录中创建一个文件并将其命名为 smcs.rsp
然后将 -unsafe
放入该文件中。保存并关闭该文件。
- 关闭并重新打开 Visual Studio 和 Unity 编辑器。
- 您必须重新启动它们。
值得注意的是,即使在执行此操作并重新启动 Unity 和 Visual Studio 之后,如果问题仍然存在,
- 将
smcs.rsp
文件重命名为 csc.rsp
、gmcs.rsp
或 mcs.rsp
每次都重新启动 Unity Editor 和 Visual Studio,直到获得一个可用的编辑器。有关要使用的文件名的更多详细信息,请参阅 Platform Dependent Compilation documentation。
在此之后编译的简单 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 2019 及以后的版本中,我们没有 2.0 子集。
使用 2.0 标准。
虽然 mcs.rsp 有效,但有一条警告指出 mcs 已过时,我们应该改用 csc.rsp。
但它确实有效!
我想在 c#
中为使用 CLR 的 Unity 使用 c++ code
。
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"
我真的很困惑,因为项目在 visual studio 中成功构建(没有任何错误或警告)。我激活了“allow unsafe”按钮。
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 子集.
2。在 <Project Path>/Assets
目录中创建一个文件并将其命名为 smcs.rsp
然后将 -unsafe
放入该文件中。保存并关闭该文件。
- 关闭并重新打开 Visual Studio 和 Unity 编辑器。
- 您必须重新启动它们。
值得注意的是,即使在执行此操作并重新启动 Unity 和 Visual Studio 之后,如果问题仍然存在,
- 将
smcs.rsp
文件重命名为csc.rsp
、gmcs.rsp
或mcs.rsp
每次都重新启动 Unity Editor 和 Visual Studio,直到获得一个可用的编辑器。有关要使用的文件名的更多详细信息,请参阅 Platform Dependent Compilation documentation。
在此之后编译的简单 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 2019 及以后的版本中,我们没有 2.0 子集。 使用 2.0 标准。
虽然 mcs.rsp 有效,但有一条警告指出 mcs 已过时,我们应该改用 csc.rsp。
但它确实有效!