pinvoke相关内容
在 C# 中,64 位 Windows + .NET 4.5(或更高版本) + 在 App.config 文件中启用 gcAllowVeryLargeObjects 允许大于 2 GB 的对象.这很酷,但不幸的是,C# 允许在字符数组中的最大元素数仍然是 限制为大约 2^31 = 21.5 亿个字符.测试证实了这一点. 为了克服这个问题,微软 建议在选项 B 中本地创建数组(他们的“选项 C
..
跟进 PInvoke 字节数组到char 在 64 位中行为不正常.(陈旧的问题和我的怀疑是错误的,因此标题和描述不合适). 我正在使用 P/Invoke 从 C# 调用 C++ 代码.我在 VS 的构建配置中将 C# 和 C++ 项目设置为在 x64 中构建.当我运行这个程序时,P/Invoke 调用的参数移动了 32 位,如下所示 C# : |参数 1|参数 2|参数 3|参数 4||
..
我曾在某个互操作(使用 DllImport)中做了一些愚蠢的事情,但它仍然可以在 32 位机器上运行. 在 64 位应用程序上有什么不同(以及为什么?)导致方法 1 的行为不同? 方法一(错误的方法): ref byte param//`DllImport`ed 函数的签名ref myarray[0]//调用函数时传入的参数 方法二(正确的方法): byte[] param//`
..
我正在验证 x64 兼容性的一些代码.以前我使用过 PInvoke.net,但我发现了一些关于 x64 的可疑声明.所以现在,我: 查找 API 参考,例如 MapViewOfFile 查找 windows 数据类型定义 找到对应的 .NET 类型. 这是我想要明确参考的第 3 步 举个例子: LPVOID WINAPI MapViewOfFile(__in 处理 hFil
..
运行我在 64 位 Vista 上编写的 c# 控制台应用程序.代码如下: class Class1{静态无效主(字符串 [] args){Debug.Assert(File.Exists(@"c:\test.ini"));StringBuilder sb = new StringBuilder(500);uint res = GetPrivateProfileString("AppName",
..
我们使用来自 C# 应用程序的自行编写的 32 位 C++ DLL.现在我们注意到,当C#应用程序在64位系统上运行时,会自动使用64位运行时,当然64位运行时无法访问32位DLL. 我的问题是:有没有办法使用 32 位 DLL?如果没有,如果我创建了 64 位版本的 DLL,是否可以轻松地让应用程序选择 P/Invoke 到哪个? 我正在考虑在 C# 中创建两个帮助程序类:一个从 3
..
例如,当我创建一个引用 user32.dll 的签名时,如果目标是 64 位计算机,我是否应该使用 user64.dll 构建它? [DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern bool ChangeClipboardChain(IntPtr hWndRemove,IntPtr hWndNewNext)
..
在 64 位 Windows 上从 64 位应用程序 pinvoke user32.dll 是错误的吗?我已经成功地完成了多次并且从未出现过错误,但这似乎是矛盾的.我应该查找 user64.dll 吗? 解决方案 user32.dll 名称具有误导性.这是您正在调用的 user32.dll 的 64 位版本.64 位版本位于 %windir%\System32\user32.dll.
..
在 C# 中使用 pinvoke 调用 _snwprintf 时遇到了一个有趣的问题.它适用于整数类型,但不适用于浮点数. 这是在 64 位 Windows 上,它在 32 位上运行良好. 我的代码如下,请记住,这是一个人为的示例,用于展示我所看到的行为. class 程序{[DllImport("msvcrt.dll", CharSet = CharSet.Unicode, Cal
..
我有一段 .NET 代码,我想将其移植到 64 位.这些代码基本上是对其他一些 C dll 的一组 P/Invoke 调用.C dll 中的函数之一具有参数“size_t".我应该在我的 P/Invoke 签名中使用什么数据类型,以便编组工作正常.我正在考虑使用 IntPtr 或 UIntPtr 但有人说它们是 .NET 中的指针等价物,不应该使用它.有谁知道这个的正确类型是什么? 解决方案
..
我从 64 位系统上的 32 位非托管 DLL 调用函数.我得到的是: BadImageFormatException:尝试加载格式不正确的程序.(来自 HRESULT 的异常:0x8007000B) 起初,我将我的项目设置为 Any CPU 平台,因此我将它们都更改为 x86,但此错误仍然发生.这确实是我所知道的唯一解决方法. DLL 没有损坏或任何东西,因为我可以将它们与其他
..
跟进 PInvoke 字节数组到char 在 64 位中行为不正常.(陈旧的问题和我的怀疑是错误的,因此标题和描述不合适). 我正在使用 P/Invoke 从 C# 调用 C++ 代码.我在 VS 的构建配置中将 C# 和 C++ 项目设置为在 x64 中构建.当我运行这个程序时,P/Invoke 调用的参数移动了 32 位,如下所示 C# : |参数 1|参数 2|参数 3|参数 4||
..
我有一个本机 32 位 dll(无源),它在我使用的应用程序中作为插件运行.我自己做了另一个本机 dll,它将与该插件通信以创建和更新插件的控件.我从那个 dll 中导出了我需要的函数,以便从我的 c# 应用程序(使用 p/invoke)控制插件. 代码如下: h 文件: #pragma once#include "include\SpoutControls.h"extern "C"
..
尝试使用 Dll 导入从 c# 访问旧的 c++ dll.在网上搜索了大约 4 天,但没有成功. 我正在尝试使用来自 asp.net mvc 3 网站 .net 4 的 c++ dll. 我已将平台目标更改为 x86.我已在 iis 中的应用程序池中将“启用 32 位应用程序"设置为 true. 使用带有 iis 7.5 的 Windows Server 2008 R2 有
..
有没有办法让 P/Invoke (DllImport) 签名引用的特定 DLL 依赖于 CPU 架构? 我正在开发一个应用程序,该应用程序从第三方供应商的本机 dll 加载大量方法签名,在本例中是用户空间接口 DLL 到一块硬件.该供应商现在已经开始提供 x86 和 x64 版本的 DLL,我认为我的应用程序将受益于作为 64 位进程运行.除了这个 DLL,一切都是 .NET 代码,因此构建
..
情况是这样,我在我的 dot.net 应用程序中使用基于 C 的 dll.有2个dll,一个是32位版本的MyDll32.dll,另一个是64位版本的MyDll64.dll. 有一个保存 DLL 文件名的静态变量:字符串 DLL_FILE_NAME. 它的使用方式如下: [DllImport(DLL_FILE_NAME, CallingConvention=CallingConven
..
在 64 位 Windows 上从 64 位应用程序 pinvoke user32.dll 是错误的吗?我已经成功地完成了多次并且从未出现过错误,但这似乎是矛盾的.我应该查找 user64.dll 吗? 解决方案 user32.dll 名称具有误导性.这是您正在调用的 user32.dll 的 64 位版本.64 位版本位于 %windir%\System32\user32.dll.
..
我从 64 位系统上的 32 位非托管 DLL 调用函数.我得到的是: BadImageFormatException:尝试加载格式不正确的程序.(来自 HRESULT 的异常:0x8007000B) 起初,我将我的项目设置为 Any CPU 平台,因此我将它们都更改为 x86,但此错误仍然发生.这确实是我所知道的唯一解决方法. DLL 没有损坏或任何东西,因为我可以将它们与其他
..
我正在尝试在 Ubuntu 18.04 上运行的 .NET Core 2.2 中的 C# 中获取 uname -r 的输出. 我在写这篇文章时考虑了性能,所以一直在尝试使用 P/Invoke 来实现它. uname(2) 文档表明我需要传入一个具有相关大小字段的结构.在玩了很多变化之后,我想出了: [StructLayout(LayoutKind.Sequential)]不安全的内部
..
简而言之,尝试在不使用 System.Windows.Forms 的情况下执行以下两行 C# 代码的操作,因为它是 .NET Core 而不是 WinForms 项目. var data = new System.Windows.Forms.DataObject(System.Windows.Forms.DataFormats.FileDrop, new string[] { @"C:\test
..