pinvoke相关内容

允许字符串大于 20 亿个字符的 C# StringBuilder 版本

在 C# 中,64 位 Windows + .NET 4.5(或更高版本) + 在 App.config 文件中启用 gcAllowVeryLargeObjects 允许大于 2 GB 的对象.这很酷,但不幸的是,C# 允许在字符数组中的最大元素数仍然是 限制为大约 2^31 = 21.5 亿个字符.测试证实了这一点. 为了克服这个问题,微软 建议在选项 B 中本地创建数组(他们的“选项 C ..
发布时间:2021-11-25 07:45:37 C#/.NET

P/Inovke 参数在 64 位编译时偏移 32 位

跟进 PInvoke 字节数组到char 在 64 位中行为不正常.(陈旧的问题和我的怀疑是错误的,因此标题和描述不合适). 我正在使用 P/Invoke 从 C# 调用 C++ 代码.我在 VS 的构建配置中将 C# 和 C++ 项目设置为在 x64 中构建.当我运行这个程序时,P/Invoke 调用的参数移动了 32 位,如下所示 C# : |参数 1|参数 2|参数 3|参数 4|| ..
发布时间:2021-11-25 07:40:04 C#

为什么(错误地)使用 ref myarray[0] 传递数组可以工作,但只能在 32 位应用程序中使用?

我曾在某个互操作(使用 DllImport)中做了一些愚蠢的事情,但它仍然可以在 32 位机器上运行. 在 64 位应用程序上有什么不同(以及为什么?)导致方法 1 的行为不同? 方法一(错误的方法): ref byte param//`DllImport`ed 函数的签名ref myarray[0]//调用函数时传入的参数 方法二(正确的方法): byte[] param//` ..
发布时间:2021-11-25 07:19:03 C#/.NET

是否有跨平台(x86 和 x64)PInvoke 和 Windows 数据类型的权威指南?

我正在验证 x64 兼容性的一些代码.以前我使用过 PInvoke.net,但我发现了一些关于 x64 的可疑声明.所以现在,我: 查找 API 参考,例如 MapViewOfFile 查找 windows 数据类型定义 找到对应的 .NET 类型. 这是我想要明确参考的第 3 步 举个例子: LPVOID WINAPI MapViewOfFile(__in 处理 hFil ..
发布时间:2021-11-25 06:54:30 C#/.NET

C#:根据平台访问 32 位/64 位 DLL

我们使用来自 C# 应用程序的自行编写的 32 位 C++ DLL.现在我们注意到,当C#应用程序在64位系统上运行时,会自动使用64位运行时,当然64位运行时无法访问32位DLL. 我的问题是:有没有办法使用 32 位 DLL?如果没有,如果我创建了 64 位版本的 DLL,是否可以轻松地让应用程序选择 P/Invoke 到哪个? 我正在考虑在 C# 中创建两个帮助程序类:一个从 3 ..
发布时间:2021-11-25 06:23:45 C#/.NET

C# 在 64 位系统上调用 user32.dll

在 64 位 Windows 上从 64 位应用程序 pinvoke user32.dll 是错误的吗?我已经成功地完成了多次并且从未出现过错误,但这似乎是矛盾的.我应该查找 user64.dll 吗? 解决方案 user32.dll 名称具有误导性.这是您正在调用的 user32.dll 的 64 位版本.64 位版本位于 %windir%\System32\user32.dll. ..
发布时间:2021-11-25 05:47:37 C#/.NET

在c#中使用pinvoke在64位上调用sprintf和朋友

在 C# 中使用 pinvoke 调用 _snwprintf 时遇到了一个有趣的问题.它适用于整数类型,但不适用于浮点数. 这是在 64 位 Windows 上,它在 32 位上运行良好. 我的代码如下,请记住,这是一个人为的示例,用于展示我所看到的行为. class 程序{[DllImport("msvcrt.dll", CharSet = CharSet.Unicode, Cal ..
发布时间:2021-11-25 05:35:54 C#/.NET

.NET 相当于 size_t

我有一段 .NET 代码,我想将其移植到 64 位.这些代码基本上是对其他一些 C dll 的一组 P/Invoke 调用.C dll 中的函数之一具有参数“size_t".我应该在我的 P/Invoke 签名中使用什么数据类型,以便编组工作正常.我正在考虑使用 IntPtr 或 UIntPtr 但有人说它们是 .NET 中的指针等价物,不应该使用它.有谁知道这个的正确类型是什么? 解决方案 ..
发布时间:2021-11-25 05:33:47 C#/.NET

“试图加载格式不正确的程序"即使平台相同

我从 64 位系统上的 32 位非托管 DLL 调用函数.我得到的是: BadImageFormatException:尝试加载格式不正确的程序.(来自 HRESULT 的异常:0x8007000B) 起初,我将我的项目设置为 Any CPU 平台,因此我将它们都更改为 x86,但此错误仍然发生.这确实是我所知道的唯一解决方法. DLL 没有损坏或任何东西,因为我可以将它们与其他 ..
发布时间:2021-11-25 04:55:22 C#/.NET

P/Inovke 参数在 64 位编译时偏移 32 位

跟进 PInvoke 字节数组到char 在 64 位中行为不正常.(陈旧的问题和我的怀疑是错误的,因此标题和描述不合适). 我正在使用 P/Invoke 从 C# 调用 C++ 代码.我在 VS 的构建配置中将 C# 和 C++ 项目设置为在 x64 中构建.当我运行这个程序时,P/Invoke 调用的参数移动了 32 位,如下所示 C# : |参数 1|参数 2|参数 3|参数 4|| ..
发布时间:2021-11-25 00:29:55 C#

我的 c++ 和 c# 互操作在 64 位中崩溃,为什么?指针大小?

我有一个本机 32 位 dll(无源),它在我使用的应用程序中作为插件运行.我自己做了另一个本机 dll,它将与该插件通信以创建和更新插件的控件.我从那个 dll 中导出了我需要的函数,以便从我的 c# 应用程序(使用 p/invoke)控制插件. 代码如下: h 文件: #pragma once#include "include\SpoutControls.h"extern "C" ..
发布时间:2021-11-25 00:15:40 C#/.NET

PInvoke c++ dll from c# - 尝试加载格式不正确的程序.(来自 HRESULT 的异常:0x8007000B)

尝试使用 Dll 导入从 c# 访问旧的 c++ dll.在网上搜索了大约 4 天,但没有成功. 我正在尝试使用来自 asp.net mvc 3 网站 .net 4 的 c++ dll. 我已将平台目标更改为 x86.我已在 iis 中的应用程序池中将“启用 32 位应用程序"设置为 true. 使用带有 iis 7.5 的 Windows Server 2008 R2 有 ..
发布时间:2021-11-25 00:09:39 C#/.NET

CPU 架构独立 P/Invoke:DllName 或路径可以是“动态的"吗?

有没有办法让 P/Invoke (DllImport) 签名引用的特定 DLL 依赖于 CPU 架构? 我正在开发一个应用程序,该应用程序从第三方供应商的本机 dll 加载大量方法签名,在本例中是用户空间接口 DLL 到一块硬件.该供应商现在已经开始提供 x86 和 x64 版本的 DLL,我认为我的应用程序将受益于作为 64 位进程运行.除了这个 DLL,一切都是 .NET 代码,因此构建 ..
发布时间:2021-11-24 23:28:33 C#/.NET

在 C# DllImport 中使用 32 位或 64 位 dll

情况是这样,我在我的 dot.net 应用程序中使用基于 C 的 dll.有2个dll,一个是32位版本的MyDll32.dll,另一个是64位版本的MyDll64.dll. 有一个保存 DLL 文件名的静态变量:字符串 DLL_FILE_NAME. 它的使用方式如下: [DllImport(DLL_FILE_NAME, CallingConvention=CallingConven ..
发布时间:2021-11-24 23:24:56 C#/.NET

C# 在 64 位系统上调用 user32.dll

在 64 位 Windows 上从 64 位应用程序 pinvoke user32.dll 是错误的吗?我已经成功地完成了多次并且从未出现过错误,但这似乎是矛盾的.我应该查找 user64.dll 吗? 解决方案 user32.dll 名称具有误导性.这是您正在调用的 user32.dll 的 64 位版本.64 位版本位于 %windir%\System32\user32.dll. ..
发布时间:2021-11-24 22:56:45 C#/.NET

“试图加载格式不正确的程序"即使平台相同

我从 64 位系统上的 32 位非托管 DLL 调用函数.我得到的是: BadImageFormatException:尝试加载格式不正确的程序.(来自 HRESULT 的异常:0x8007000B) 起初,我将我的项目设置为 Any CPU 平台,因此我将它们都更改为 x86,但此错误仍然发生.这确实是我所知道的唯一解决方法. DLL 没有损坏或任何东西,因为我可以将它们与其他 ..
发布时间:2021-11-24 22:46:51 C#/.NET

在 Linux 上的 .NET Core 中从 C# 获取 uname 发布字段

我正在尝试在 Ubuntu 18.04 上运行的 .NET Core 2.2 中的 C# 中获取 uname -r 的输出. 我在写这篇文章时考虑了性能,所以一直在尝试使用 P/Invoke 来实现它. uname(2) 文档表明我需要传入一个具有相关大小字段的结构.在玩了很多变化之后,我想出了: [StructLayout(LayoutKind.Sequential)]不安全的内部 ..
发布时间:2021-11-24 20:13:40 C#/.NET