问题标签 [pinvoke]

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.

0 投票
2 回答
1304 浏览

air - 如何从 C 程序将 AIR 运行时加载为进程内共享库

我想按照 java.exe 的方式用 C 语言构建一个特殊的 AIR 启动程序。

我用进程查看器查看了运行 AIR 程序,并且能够找到正在使用的 AIR 运行时 DLL。AIR 程序与 Java 的不同之处在于,它们作为特定于平台的可执行文件安装,一旦启动,它们就会将 AIR 运行时绑定为进程内共享库(用户双击它们的图标)。

好吧,我想制作一个类似于 java.exe 的 AIR 启动器。

java.exe 作为平台操作系统进程启动,它作为进程内共享库绑定到 Java JVM 运行时 (JRE)。要执行的 java 应用程序被指定为 java.exe 的命令行参数。一旦 java.exe 运行并且 JVM 完全正常运行,指定的 java 应用程序类将由 JVM 类加载器加载以执行。然后,指定的 Java 应用程序接管,在某种意义上“劫持”了 java.exe 的进程。当然,指定的 java 应用程序会在任何进程列表中显示为托管它的 java.exe 程序。

我想让 AIR 应用程序启动像这样工作。为什么?所以我可以探索破解 AIR 的方法,也许可以克服它的许多缺陷。例如,对于初学者,我想通过一些新的 API 来扩展 AIR 运行时体验,这些 API 可用于正在运行的 AIR 应用程序。

我的首要任务是:

  • 实现与 .NET PInvoke 相当的 ActionScript3 到 C 的绑定接口
  • 添加一个用于启动进程的 API,该 API 与 Java SE 中的 API 相当(Runtime.exec、ProcessBuilder、Process)
  • 添加对 AIR 应用程序的支持,以便能够与 stdin、stdout、stderr 交互。奇怪的是,尽管 Adob​​e 在 AIR 中添加了对本地文件访问的支持,但它们却省略了与这些标准文件管道的交互(但它们可以在 AIR 支持的任何操作系统平台上找到)。
  • 通过 stdin、stdout、stderr 实现对 AMF 的支持——因此 AIR(或 Java 或任何支持 AMF 的语言)应用程序可以通过交换 AMF 对象来进行通信。这将为 AIR 添加一点微软的 PowerShell。

目前 Merapi 提供了一个带有 Java 的 AMF 桥接器,从而证明了它的功效。唉,Merapi 必须使用 localhost 端口和套接字来进行进程间通信——相对于使用 stdin/stdout/stderr 进程间管道,这是一种笨拙的方式。

0 投票
2 回答
1929 浏览

.net - Pinvoke 调用获取 Windows 序列号?

获取 Windows 序列号的常规方法是 WMI。

我不想使用 WMI,因为紧凑的框架不支持它。该程序集必须在桌面和紧凑框架端工作,因此我无法添加参考。

如何使用 pinvoke 调用获得相同的结果?

0 投票
5 回答
2129 浏览

.net - 仅使用原始类型的本机互操作的开销

我正在考虑将我的 C# 项目中的一小部分代码移植到 C/ASM 以获得性能优势。(这部分代码使用了许多按位运算,并且是少数几个使用本机代码可能会真正提高性能的地方之一。)然后我计划通过 P/Invoke 在单独的 DLL 中简单地调用本机函数。现在,将在托管代码和本机代码之间传递的唯一数据将是纯原始类型(bool、int、long、一维数组等)。所以我的问题是:仅使用原始类型的 P/invoke 会有任何重大开销吗?我知道在使用更复杂的类型时会产生大量开销,因为它们需要编组(固定/复制),但也许在我的情况下它会相对有效(甚至与从本机 DLL 本身调用代码相比)?如果有人能为我澄清这个问题,解释性能优势/命中的程度及其背后的原因,将不胜感激。完成整个任务的另一种方法也将受到欢迎,但由于 C# 缺乏对内联汇编/CIL 的支持,我不相信有一个。

0 投票
2 回答
1776 浏览

c# - pinvoke:不确定如何使用 dllimport 和导入的库

我正在对 C++ dll 执行 dllImport,并且我有以下签名。到目前为止,StackOverflow 一直很有帮助,所以我想我会扔掉这个,看看我得到了什么。

有什么我应该担心的问题吗?这是我第一次使用 dllimport。

我需要将以下内容导入 C#:

处理 FooInit(char* 名称); //名称似乎是一个字符串,如“COM1”

int Foo1(HANDLE 句柄, const char** 句); //sentence 似乎是一个类似“Hello World”的字符串

int Foo2(HANDLE 句柄, DWORD* val);

非常感谢!

0 投票
1 回答
1251 浏览

c# - 从非托管 unicode 字符串创建 SecureString

我想尝试以最好的方式将 CryptUnprotectData windows API 函数和 .net SecureString 联系在一起。CryptUnprotectData 返回一个由字节数组和字节长度组成的 DATA_BLOB 结构。在我的程序中,这将是一个 Unicode UTF-16 字符串。SecureString 有一个构造函数,它接受一个 char* 和长度参数,所以我希望能够执行以下操作:

这行得通,除了 UTF-16 是可变长度的,所以我真的不知道用什么作为长度参数。上面的示例假设 2 字节字符 (BMP),但对于其他平面,它可能最多为 4 字节。我需要知道字节数组中 UTF-16 字符的数量。在不复制内存中的值(从而损害安全性)的情况下,最好的方法是什么。我计划尽快清零并释放字节数组。

0 投票
2 回答
1056 浏览

c# - P/Invoking CryptImportKey 和封送结构

我正在尝试从 C# P/Invoke 到 CryptImportKey 以设置一个已知密钥,然后再加密将在某个时候在 C++ Win32 服务中解密的数据。我有 P/Invoke 的方法签名,一切正常,但我无法让它接受我的密钥 blob。C++ 结构在下面的注释中,我的用于编组的 C# 结构在下面。

然后我使用:

要进入一个字节数组以传递给 CryptImportKey 但它似乎从来没有带走密钥,当我用它加密时,我得到不同的密文时间,表明它没有使用我的密钥。

编辑:

关键 blob 内容来自我拥有的可以成功加密和解密数据的 C++ 代码。我认为您可能对包含两次的标头有所了解,但我遇到的主要问题是 Byte[] rgbKeyData 的值没有被放入字节数组 arr 中。

0 投票
3 回答
12768 浏览

c# - 如何将 void * C API 导入 C#?

鉴于此 C API 声明,如何将其导入 C#?

我已经能够做到这一点:

自然在 C# 中“void *”不会编译。

一些谷歌搜索表明它应该被翻译为“对象”。这似乎应该工作。但其他人指出“Void * 在 C/C++ 术语中称为函数指针,在 C# 术语中是委托”。这在这里没有多大意义,因为它将委托给什么?通过谷歌搜索找到的对其他 API 的一些类似调用使用相应 API 中的其他函数。但是在这个 API 中,没有其他调用是有意义的。

调用的文档显示了一个示例:

这似乎表明即使是静态值也可以传递。

它将用对象代替 void * 进行编译。我不知道这是否正确,我也没有机会对其进行测试(许可问题)。

0 投票
4 回答
431 浏览

c# - 如何将 const int * const buffer[] 导入 C#?

这对我来说很棘手。

目前,我将其翻译如下:

问题是当 DLL 使用上述参数调用函数时,我遇到了 AccessViolation 异常。

感谢帮助。

0 投票
4 回答
3625 浏览

c# - P/Invoke、固定和 KeepAlive 最佳实践

在工作中,我们有一个本机 C 代码,负责读取和写入专有的平面文件数据库。我有一个用 C# 编写的包装器,它将 P/Invoke 调用封装到一个 OO 模型中。自项目启动以来,P/Invoke 调用的托管包装器的复杂性显着增加。有趣的是,当前的包装器做得很好,但是,我认为我实际上需要做更多的事情来确保正确的操作。

答案带来了一些注意事项:

  1. 可能不需要 KeepAlive
  2. 可能不需要 GCHandle 固定
  3. 如果您确实使用 GCHandle,请尝试...最后是该业务(尽管 CER 问题未解决)

以下是修改后的代码示例:

我的(修改后的)问题是:

  1. 数据、详细信息和状态是否会自动固定/保持活动状态?
  2. 我是否错过了正常运行所需的其他任何内容?

编辑:我最近发现了一个图表,它激发了我的好奇心。它基本上表明,一旦您调用 P/Invoke 方法,GC 就可以抢占您的本机代码。因此,虽然本地调用可能是同步进行的,但 GC可以选择运行和移动/删除我的内存。我想现在我想知道自动固定是否足够(或者它是否可以运行)。

0 投票
2 回答
4398 浏览

.net - .NET PInvoke 可以从用户指定的目录动态加载本机 dll 吗?

我有一个 .NET 应用程序,需要加载一个本地库,其位置由用户指定。PInvoke 看起来只会从全局搜索路径(或编译时指定的路径?)加载。最好的方法是创建一个在运行时调用 LoadLibrary 的 C++/CLI 程序集吗?

C++/CLI 会比 C# PInvoking LoadLibrary 更简单吗?