我正在处理一个WriteableBitmapC#.我目前正在使用不安全的代码块来直接访问像素WriteableBitmap.BackBuffer./unsafe但是,我宁愿不依赖于选项,所以我正在考虑使用WriteableBitmap.WritePixels.
是否有某种方式在"不安全"版本中有条件地编译,以便在使用/ unsafe编译选项时可以使用它,而无需手动集成到我的项目文件中?
总之,我正在寻找以下内容:
#if UNSAFE
//my unsafe version
#else
//the supposedly safe version goes here
#endif
Run Code Online (Sandbox Code Playgroud)
在运行时检测也很好; 但这意味着我总是需要编译使用 /unsafe,这意味着该库的代码需要的项目文件更新,这是不太方便的.
基本上,我想保留快速版本的重要性,但有一个合理的版本,无论如何都能正常工作.
我有一些代码使用LockBits方法进行位图操作,并使用指针直接访问位图数据.当然,这段代码必须包装在一个不安全的块中,我想知道这是否意味着代码在Mono中不起作用.
我假设Bitmap类在Mono中可用,但也许这是另一个交易破坏者.
在看这个问题时,Jon在回答问题方面做得很好......" 如何用迭代器反向读取文本文件 ".并且有一个类似的问题,我回答使用指针hocus pocus ..'.net有一种方法从它自己关闭之前从下到上读取文本文件 ....
现在我开始尝试使用指针来解决这个问题,好吧,它看起来很粗糙和边缘粗糙......
public class ReadChar : IEnumerable<char>
{
private Stream _strm = null;
private string _str = string.Empty;
public ReadChar(string s)
{
this._str = s;
}
public ReadChar(Stream strm)
{
this._strm = strm;
}
public IEnumerator<char> GetEnumerator()
{
if (this._strm != null && this._strm.CanRead && this._strm.CanSeek)
{
return ReverseReadStream();
}
if (this._str.Length > 0)
{
return ReverseRead();
}
return null;
}
private IEnumerator<char> ReverseReadStream()
{
long lIndex = this._strm.Length;
while (lIndex != … 如果可以将一个指向数组的指针放在C#中的不安全结构中的子结构中,就像在C中一样,构建复杂的数据结构而不会产生每个节点有一个对象的开销,这样会更容易,而且时间更少,以及语法更清晰,更易读.
是否有一个深层的架构原因,为什么不安全的结构中的固定数组只允许由"值类型"而不是指针组成?
我假设只有在结构中明确命名指针必须是故意削弱语言的决定,但我找不到任何关于为什么会这样的文档,或者不允许指针数组在结构中的原因,因为我会假设垃圾收藏家不应该关心被标记为不安全的结构.
数字火星'D优雅地处理结构和指针,我发现我无法快速开发简洁的数据结构; 通过在C#中引用抽象,很多功能似乎已从语言中删除,即使指针至少仍然存在于营销意义上.
也许我错误地期望语言随着时间的推移有效地表示复杂的数据结构.
Sonar在我们的Java项目中指出了这个错误.欢迎任何安全编程的建议!
URL url = getClass().getResource("/myWonderfulResource.txt");
if (url == null) {
throw new IllegalStateException("File not found: /myWonderfulResource.txt");
}
Run Code Online (Sandbox Code Playgroud) 我正在用C#做一个项目,它可以从线性代数包中受益.我看过那里的那些,但我真的不想付钱,或者我发现它们不是很好.所以我决定写自己的.
我读到C++数组比C#数组快得多,但是在C#中使用指针数组可以获得类似的性能,尽管它们被认为是"不安全的".我很想知道C++指针是如何不同的,如果"不安全"也适用于C++,或者它们是两个根本不同的东西.
我想在c#中使用c ++代码来使用CLR进行统一.
该程序在统一之外正常工作,但在引擎内部它给我一个错误:
"cs0227:不安全的代码需要指定'unsafe'命令行选项"
我真的很困惑,因为该项目在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();
}
Run Code Online (Sandbox Code Playgroud) 我需要unsafe用C#编写一个方法,显然“在安全上下文中不能使用不安全的构造”。我去了项目属性,并看到了一个允许在Debug和Release版本中使用不安全代码的开关。
但是,它不可单击。
如何为我的项目允许使用不安全的代码?
编辑:添加<AllowUnsafeBlocks>true</AllowUnsafeBlocks>到PropertyGroup标签中的csproj文件不解决这个问题,但我不知道是否有一种方法在IDE本身要做到这一点,因为我期望的IDE能够做到这些类的东西。
一个指向数组的指针,让我们说:
p := uintptr(unsafe.Pointer(&array))
size := 5
Run Code Online (Sandbox Code Playgroud)
我无法访问变量array,上面的代码用于使其更清晰.
另外,我知道数组的大小,但size它不是常量,它会根据运行时间而变化.
现在,我想用已知的指针,大小以及数据类型初始化切片或数组.
我想出了以下代码:
data := make([]byte, size)
stepSize := unsafe.Sizeof(data[0])
for i := 0; i < size; i++ {
data[i] = *(*byte)(unsafe.Pointer(p))
p += stepSize
}
fmt.println(data)
Run Code Online (Sandbox Code Playgroud)
但是这个方法会进行内存复制,这可能是效率低下的,无论如何都没有复制?
PS我也试过以下两种方法,
// method 1
data := *(*[]byte)(unsafe.Pointer(p))
// method 2
data := *(*[size]byte)(unsafe.Pointer(p))
Run Code Online (Sandbox Code Playgroud)
但它会在运行时失败,我现在知道它的原因.
我已经注意到unsafe在类级别上对部分类使用修饰符时的某种行为,我希望得到一些澄清.
我一直在研究一个相当大的包装器,为了理智,我使用partial修饰符分割多个文件.包装器大量使用unsafe指针,因此我选择在类级别上简单地声明它以覆盖其中的所有内容.
public static unsafe partial class Ruby
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static VALUE CLASS_OF(VALUE obj) => ((RBasic*) obj)->klass;
}
Run Code Online (Sandbox Code Playgroud)
在另一个文件中:
public static unsafe partial class Ruby
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void* DATA_PTR(VALUE obj) => ((RData*) obj)->data;
}
Run Code Online (Sandbox Code Playgroud)
该unsafe修改需要每个部分的声明,以使不安全的代码被"允许"和编译,这是可以理解的,我希望,对于部分类的类声明将需要完全匹配.
但是使用那个逻辑,我也被允许有另一个不是的文件unsafe:
[SuppressUnmanagedCodeSecurity]
public static partial class Ruby
{
[DllImport(RUBY_LIBRARY, CallingConvention = CallingConvention.Cdecl)]
public static extern VALUE rb_ivar_get(VALUE obj, ID name);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我不使用unsafe修饰符,它是完全可以接受的(显然在这个文件中没有不安全的代码).
我是什么希望得到澄清为什么这允许.每个分类的类声明不应该完全匹配吗?改变/不包括任何其他类改性剂是不允许的,例如private,public,abstract等等,所以这是为什么好吗用unsafe …