gpt4 book ai didi

c# - 编码 C 和 C#

转载 作者:太空宇宙 更新时间:2023-11-03 20:22:12 25 4
gpt4 key购买 nike

我的项目中有以下编码代码。我对此没有什么问题。

[DllImport=(Core.dll, SetLastError=true, EntryPoint="CoreCreate", CharSet="CharSet.Ansi", CallingConvention="CallingConvention.Cdecl")]
internal static extern uint CoreCreate(ref IntPtr core);
  1. 为什么需要'internal static extern'?这是强制性的吗?为什么要使用这个?
  2. 什么是SetLastError
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
internal struct Channel
{
internal byte LogicalChannel;
}

为什么 LayoutKind.Sequential

最佳答案

Why 'internal static extern' is required?

internal修饰符只是设置你的方法的可见性。不需要是 internal所以你可以声明方法 privatepublic根据您的需要和使用任何其他标准方法的方式。

static修饰符是必需的,因为它不是实例方法,并且该方法不知道任何类(它没有 this 指针)。

最后extern需要通知编译器该方法未在此处实现,而是在另一个地方实现(您将指定使用属性的位置)。每晚extern必须声明方法 static也是(因为它是一个简单的函数调用,对对象一无所知)。

What is SetLastError?

它表示该方法可能会更改线程的最后一个错误代码值。查看 GetLastError() 有关详细信息的功能。如果被调用的函数会改变这个值,那么最好设置 SetLastErrortrue , 来自 MSDN:

The runtime marshaler calls GetLastError and caches the value returned to prevent it from being overwritten by other API calls. You can retrieve the error code by calling GetLastWin32Error.

简而言之,它将 GetLastError() 返回的值保存到内部缓存中,因此对系统 API 的任何其他调用(甚至是其他框架函数的内部调用)都不会覆盖该值。

Why LayoutKind.Sequential?

.NET 中的类布局不需要在内存中按顺序排列(顺序 = 如果 AB 之前声明,则内存布局在 A 之前有 B)。在声明顺序很重要的 C 中,情况并非如此(编译器使用声明来理解原始数据在内存中的布局)。如果您必须与 C 函数互操作,那么您必须确定传递给它们的数据的布局。这是如何LayoutKind.Sequential有效:它指示编译器遵守 struct 中数据的声明顺序.这不是与非托管世界互操作的唯一选项,您甚至可以显式设置每个字段的偏移量(从结构开始)(请参阅 LayoutKind.Explicit)。

关于c# - 编码 C 和 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12815882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com