问题标签 [unsafe]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 从 C# 调用 AuditQuerySystemPolicy() (advapi32.dll) 返回“参数不正确”
顺序如下:
LsaOpenPolicy()
使用(未显示)打开策略句柄- 调用
LsaQueryInformationPolicy()
获取类别数量; - 对于每个类别:
- 调用
AuditLookupCategoryGuidFromCategoryId()
将枚举值转换为 GUID; - 调用
AuditEnumerateSubCategories()
以获取所有子类别的 GUID 列表; - 调用
AuditQuerySystemPolicy()
以获取子类别的审计策略。
- 调用
所有这些工作并返回预期的、合理的值,除了最后一个。打电话AuditQuerySystemPolicy()
给我一个“参数不正确”的错误。我在想一定有一些微妙的解组问题。我可能误解了究竟AuditEnumerateSubCategories()
返回了什么,但我很难过。
你会看到(注释)我试图从指针中取消引用返回AuditEnumerateSubCategories()
指针。这样做或不这样做都会产生相同的结果。
代码:
c# - 通过反射确定方法是否不安全
我正在寻找一种方法来过滤掉unsafe
通过反射具有修饰符的方法。它似乎不是方法属性。
有办法吗?
编辑:似乎这个信息不在元数据中,至少我在 IL 中看不到它。但是反射unsafe
器在 C# 视图中显示修饰符。关于它是如何完成的任何想法?
编辑 2:为了我的需要,我最终进行了检查,假设如果方法的参数之一是指针,或者返回类型是指针,那么该方法是不安全的。
当然,这不能处理在方法中执行不安全块的情况,但同样,我感兴趣的只是方法签名。
谢谢!
c# - .NET:显示对象的存储位置或地址?
有没有办法获取对象的“地址”?这是出于演示目的,我知道这通常是一个坏主意,如果它完全可以作为unsafe
代码工作。该项目已调整为允许不安全的代码。然而我的尝试没有成功。我到目前为止的代码没有编译:
Error: Cannot take the address of, get the size of, or declare a pointer to a managed type ('object')
即使无法检索内存地址,也可能是内存插槽或其他显示该对象位置的东西。
背景:我的目的是做一些演示,展示按值传递或按引用传递之间的差异,并转储这些对象的位置。
添加于 2010 年 6 月 27 日:
我最终放弃了从 .NET 程序本身内部进行操作的想法。似乎不会导致任何好的解决方案。即使它成功了,它也会使代码变得如此混乱,以至于你几乎无法用简单的方式解释结果并将其用于一些演示目的。我现在想按照下面答案中建议的方式使用一个好的(意味着 CLR 感知)调试器来完成它。
调试可以通过激活配置设置中的一个选项在 VS 内部进行改进Enable Unmanaged Debugging
,不幸的是在 Visual Studio 的免费快速版(我现在在家中唯一的版本)中不可用。有没有办法Enable Unmanaged Debugging
手动进行工作?
经过一番挣扎后,我安装了 Windows 调试工具,它为我提供了 WinDbg。我多年前用于驱动程序开发的好工具。现在它是一个巨大包裹的一部分。我试图按照说明让 SOS.DLL 工作但没有成功。我什至找不到这个 DLL。即使这个解决方案似乎也需要Enable Unmanaged Debugging
项目中的标志......
c# - 在 C# 中从 void* 转换为对象
在 C# 项目中,我需要通过将引用放入结构中来传递对象参数。即我有一个结构传递给调度员
其中 lpObject 包含一个指向自定义对象的指针,例如
SOMESTRUCT 结构从一个方法传递到另一个方法,最终到达我的代码。我无法修改执行流程,也无法修改奇怪的 SOMSTRUCT 系统,所以我猜唯一的解决方案是将我的对象转换为这样的指针:
但是,我不知道如何从 lpObject 字段中检索 myObject 成员。像这样的东西:
有没有办法做到这一点,还是不可能?如何告诉垃圾收集器处理对象?我应该创建一个新的垃圾收集对象并逐个字段复制数据吗?
蒂亚,
c# - C# 中的不安全代码
C# 中不安全代码的限制是什么?例如,我可以像使用 C 或 C++ 一样进行几乎任意的指针转换和算术运算吗?
c# - 如何将 int 设置为 byte* C#
如何在字节*中的某个索引处将 int 转换为字节*?
理想情况下,我想要类似的东西:
它将位的第一部分设置为 igm[4],其余部分设置为 igm[5]。
编辑:我意识到可能有很多可能的方法来处理这个问题,如果可能的话,我正在寻找最有效的方法。
c# - C# 中 bool* 的用处
我可以bool*
以任何有意义的方式使用吗?我将如何转换bool*
为byte
例如,或存储bool*
在一个字节中
我的目标是在我的一个项目中管理我自己的记忆,细节并不重要,只是我喜欢做的事情。现在我希望能够存储我自己的变量,而我恰好需要存储一个布尔值。我如何使用unsafe
和 abyte*
存储这个布尔值,并最好地利用我的空间?理想情况下,在字节中存储 4 位。
.net - 在 .NET 中使用不安全代码时是否有限制?
我在 .NET 中看到了允许不安全代码选项。只有我的一个应用程序设置了它,所以我可以快速将图像复制到位图。
现在我勾选了那个框会有限制吗?mono 似乎在 linux 上运行良好。到目前为止,我没有看到任何问题。
.net - 不安全代码上的 CLR 和指向数组的指针?
CLR 如何与不安全代码交互我在 Google 上找到了各种结果,但我无法理解。我也很困惑垃圾收集器是否在处理不安全的代码?如果是,比怎么样?
我不能将指针指向数组的第一个元素我试试这段代码
但我得到了那个错误错误:无法将类型'int []'隐式转换为'int *'
c# - 从 C# 调用 C++ 函数 - 不平衡堆栈
我有一个具有以下签名的非托管 C++ 函数:
我试图从 C# 调用它:
...
据我从旧的 C++ 项目规范中可以看出,param的 null 和ret的0都是函数的有效输入。当我尝试调用它时,它似乎可以工作,但是在退出时出现以下错误:
检测到 PInvokeStackImbalance
调用 PInvoke 函数 '...::Invoke' 使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
我已经尝试了几乎所有我能想到的东西(不安全是最后的手段),但是我找不到任何方法来运行该函数而不会得到不平衡的堆栈。还有什么我可以尝试的吗?