当前位置: 首页 > news >正文

如何在 .NET 项目中开启不安全代码(以便启用 unsafe fixed 等关键字)

有小伙伴希望在 .NET 代码中使用指针,操作非托管资源,于是可能使用到 unsafe fixed 关键字。但使用此关键字的前提是需要在项目中开启不安全代码。

本文介绍如何在项目中开启不安全代码。


本文内容

    • 入门方法
    • 高级方法
    • 临时方法
    • 其他说明

入门方法

第一步:在你需要启用不安全代码的项目上点击右键,然后选择属性:

项目 - 属性

第二步:在“生成”标签下,勾选上“允许不安全代码”:

允许不安全代码

第三步:切换到 Release 配置,再勾上一次“允许不安全代码”(确保 Debug 和 Release 都打开)

在 Release 允许不安全代码

方法结束。

如果你一开始选择了“所有配置”,那么就不需要分别在 Debug 和 Release 下打开了,一次打开即可。

高级方法

推荐

如果你使用 .NET Core / .NET Standard 项目,那么你可以修改项目文件来实现,这样项目文件会更加清真。

第一步:在你需要启用不安全代码的项目上点击右键,然后选择编辑项目文件:

编辑项目文件

第二步:在你的项目文件的属性组中添加一行 <AllowUnsafeBlocks>true</AllowUnsafeBlocks>

我已经把需要新增的行高亮出来了

    <Project Sdk="Microsoft.NET.Sdk">

      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
++      <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
      </PropertyGroup>

    </Project>

临时方法

不推荐

如果你只是临时希望加上不安全代码开关,则可以在编译的时候加入 -unsafe 命令行参数:

csc -unsafe walterlv.cs

注意,不能给 msbuild 或者 dotnet build 加上 -unsafe 参数来编译项目,只能使用 csc 加上 -unsafe 来编译文件。因此使用场景非常受限,不推荐使用。

其他说明

第一种方法(入门方法)和第二种方法(高级方法)最终的修改是有一些区别的。入门方法会使得项目文件中有针对于 Debug 和 Release 的不同配置,代码会显得冗余;而高级方法中只增加了一行,对任何配置均生效。

因此如果可能,尽量使用高级方法呗。

    <Project Sdk="Microsoft.NET.Sdk">

      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
++      <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
      </PropertyGroup>

--    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
--      <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
--    </PropertyGroup>

--    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
--      <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
--    </PropertyGroup>

    </Project>

即使是 .NET Framework 也是可以使用 SDK 风格的项目文件的,详情请阅读:

  • 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成 Sdk 风格的 csproj - walterlv

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • WPF 高性能位图渲染 WriteableBitmap 及其高性能用法示例
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • 使用 Direct3D11 的 OpenSharedResource 方法渲染来自其他进程/设备的共享资源(SharedHandle)
  • 将 Direct3D11 在 GPU 中的纹理(Texture2D)导出到内存(Map)或导出成图片文件
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • C#/.NET 当我们在写事件 += 和 -= 的时候,方法是如何转换成事件处理器的
  • 清理 git 仓库太繁琐?试试 bfg!删除敏感信息删除大文件一句命令搞定(比官方文档还详细的使用说明)
  • 可集成到文件管理器,一句 PowerShell 脚本发布某个版本的所有 NuGet 包
  • Windows 系统的默认字体是什么?应用的默认字体是什么?
  • C# 8.0 的可空引用类型,不止是加个问号哦!你还有很多种不同的可空玩法
  • 一个简单的方法:截取子类名称中不包含基类后缀的部分
  • 使用 MSBuild Target 复制文件的时候如何保持文件夹结构不变
  • 如何在 MSBuild 中正确使用 % 来引用每一个项(Item)中的元数据
  • 如何将一个 .NET 对象序列化为 HTTP GET 的请求字符串
  • 屏幕边缘上有趣的 1 个像素,看不见、摸不到
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 30天自制操作系统-2
  • Mac转Windows的拯救指南
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 前端之Sass/Scss实战笔记
  • 少走弯路,给Java 1~5 年程序员的建议
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 为视图添加丝滑的水波纹
  • 温故知新之javascript面向对象
  • 用mpvue开发微信小程序
  • 带你开发类似Pokemon Go的AR游戏
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​批处理文件中的errorlevel用法
  • (23)Linux的软硬连接
  • (C#)获取字符编码的类
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)斐波那契Fabonacci函数
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)计算机毕业设计大学生兼职系统
  • (生成器)yield与(迭代器)generator
  • (十一)图像的罗伯特梯度锐化
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)nsfocus-绿盟科技笔试题目
  • ***通过什么方式***网吧
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 微服务 服务保护 自动重试 Polly
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .Net各种迷惑命名解释
  • .NET中的Exception处理(C#)
  • :如何用SQL脚本保存存储过程返回的结果集
  • ??javascript里的变量问题
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @Conditional注解详解
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [ES-5.6.12] x-pack ssl
  • [E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)