将 C char[][] 数组封送至 C#

2023-12-27

我已经看了又看并尝试了我能想到的或找到的建议。我仍然没有运气获得我需要的数据。

我正在使用第三方 DLL,我相信它是用 C 编写的。我需要用 C# 访问此 DLL 中的函数。在大多数情况下,除了一项功能外,我都可以使用此功能。我遇到问题的函数具有以下标题:

uint queryNumOfServers(USHORT *NumOfServers, char ServerNames[8][16]);

我在 C# 应用程序中声明了以下内容

[DllImport("client.dll", CharSet=CharSet.Ansi]
public static extern uint queryNumOfServers(ref short numberofServer, StringBuilder serverNames);

我这样称呼它:

StringBuilder serverNames = new StringBuilder(128);
short numServers = -1;
queryNumberOfServers(ref numServers, serverNames);

问题是,虽然 numberOfServers 返回等于 4,但我在 serverNames 中只得到一个名称。我已经在一个小型 C 程序中测试了上述 C 函数。我得到了 numberOfServer = 4 但我也得到了 4 个名称。


我尝试了以下方法但没有成功:

[DllImport("client.dll", CharSet=charSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern uint queryNumOfServers(ref short numberOfServer,[MarshalAs(UnmanagedType.LPStr)] string serverNames);

调用这个

string serverNames = new string('\0', 128);
queryNumOfServers(ref numServers, serverNames);

使用此选项不会更改 serverNames。


开发环境为Visual Studio 2008。


经过大量搜索和拉扯,这就是对我有用的解决方案。

在我的 C# 应用程序中将函数头声明为:

[DllImport("client.dll", CharSet = CharSet.Ansi)]
public static extern uint queryNumOfServers(ref short numberOfServers, [MarshalAs(UnmanagedType.LPArray)] byte[,] serverNames);

然后调用如下:

byte[,] serverNames = new byte[8,16];
short numServers = -1;
queryNumberOfServers(ref numServers, serverNames);

这将返回一个双索引字节数组。从这里我使用 Buffer.BlockCopy() 和 Encoding.UTF8.GetString() 将字节数组转换为字符串数组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 C char[][] 数组封送至 C# 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 关系表的复合索引

    我有以下表格 CREATE TABLE students student id int NOT NULL AUTO INCREMENT student name varchar 40 NOT NULL DEFAULT PRIMARY KEY
  • 块中的线程数

    I used x y用于计算设备中矩阵的单元格 当我对 lenA 和 lenB 使用超过 32 个时 断点 在int x threadIdx x 在设备代码中 无法工作并且输出不正确 在主机代码中 int lenA 52 int lenB
  • 使用 pyinotify 过早发出 IN_CLOSE_WRITE 通知

    我遇到以下情况 pyinotify 监视文件中的 IN CLOSE WRITE 事件 我更改文件中的某些内容并保存 事件被触发 我阅读了该文件 发现它没有任何更改 经过一番修改后 我注意到在调试时它工作得很好 我在读取文件的行上设置了一个断
  • 使用 Windows 10 访问 COM 端口

    我有一些愚蠢的代码来访问 Windows COM 端口 只是一些最相关函数的伪代码 open device COMMTIMEOUTS timeouts DCB ComSettings memset ComSettings 0 sizeof
  • 如何让函数返回指向函数的指针? (C++)

    我正在尝试创建一个函数 它接受一个字符 然后根据该字符返回一个指向函数的指针 我只是不确定如何使函数返回指向函数的指针 int f char return 0 int return f char return f 不 说真的 使用 type
  • Ag-grid:在特定的预定义时间内保持打开的工具提示

    我使用的是Ag grid v23 1 1 我需要显示 1 分钟的工具提示 Ag grid不支持这种情况 但在版本 22 的早期我使用过 next lifehack params api context beanWrappers toolti
  • 建议:c++ 中的异步、可移植文件 io

    我正在寻找一个 C 异步 io 库 它应该与 unix 和 windows 系统兼容 有哪些好的图书馆 对于一个同时支持这两个系统的库来说 这要求是否太高了 人们对此事有何经验 Use 增强 asio http www boost org
  • Eclipse Java 错误:无法启动此选择并且最近没有启动

    我在互联网上到处查看并尝试了论坛所说的所有操作 但没有任何效果 这个错误不断出现 我尝试运行我的java项目 不适用于android 即使下拉运行按钮也不起作用 因为它说 不适用 Eclipse 需要查看项目源文件之一中的 main 方法
  • PHP - 保护代码[重复]

    这个问题在这里已经有答案了 可能的重复 如何保护您的软件代码 https stackoverflow com questions 2368064 how to protect your software code 保护我的 PHP 应用程序
  • 正则表达式替换第二次出现的字符

    我有一些以下格式的数据 MM SS 嗯 where MM is minutes ss is seconds and mmm is 3 digit milliseconds like 05 23 236 我试图用点替换第二次出现的冒号 05
  • $this是什么意思

    我见过一些脚本包含 this在具有 OOP 的 PHP 脚本中 我从来不知道它的含义 就像 this gt refresh 也许向我解释一下什么 this指的是 但我确实知道你不能将它用作动态变量 例如 this is a variable
  • 如何像 ps -e 一样显示进程

    Hello 我想制作一个简单的 C 程序 就像 ps i 一样工作 唯一应显示的列是 PID 和 CMD 那是我的代码 include
  • 常见的 SIMD 技术

    在哪里可以找到有关常见 SIMD 技巧的信息 我有一个指令集 并且知道如何编写不复杂的 SIMD 代码 但我知道 SIMD 现在更加强大 它可以容纳复杂的条件无分支代码 例如 ARMv6 以下指令序列将 Rd 的每个字节设置为 Ra 和 R
  • Docker 退出,状态码 139

    我有一个 Net Core 应用程序 它可以在 Docker 映像上运行 我在命令行中输入 docker run d net bridge it name testapp v var test var test microsoft aspn
  • Selenium Webdriver + python - 鼠标悬停后无法隐藏工具提示

    我正在使用 Selenium WebDriver 和 Firefox 在我的网页上测试工具提示 我试图将鼠标悬停在附加工具提示的元素上 测试工具提示是否显示 然后将鼠标悬停在另一个元素上并测试其各自的工具提示 element to clic
  • Angularjs $http 在 GET 上期望 JSON 结果时出现“XML 解析错误:找不到元素位置”错误

    当我提交一个角js httpGET 调用我收到 XML 解析错误 http调用代码片段是 http method GET url myapp api items itemId 错误是 XML Parsing Error no element
  • PySpark:如何根据多个条件附加其他 pyspark 数据帧中的新列?

    我有 pyspark df1 id name email age college 12 Sta email protected cdn cgi l email protection 25 clg1 21 Danny email protec
  • MVC 6 中多个网站的通用 wwwroot 文件夹

    我有多个网站使用 wwwroot assets文件夹 html 主题 css 和 javascript 文件 来加载静态内容 目前我正在复制assets每个站点中的文件夹 我的所有项目都位于一个公共父目录下 我不想复制 wwwroot as
  • 基于 Codeigniter 数据库的配置设置

    我正在使用最新版本的 Codeigniter 2 0 构建一个应用程序 我想你可能会说 我的应用程序是动态的 有点像自定义 CMS 我有一个名为 设置 的数据库表 其中包含以下字段 id name value 基本上我当前正在做的是使用辅助
  • 将 C char[][] 数组封送至 C#

    我已经看了又看并尝试了我能想到的或找到的建议 我仍然没有运气获得我需要的数据 我正在使用第三方 DLL 我相信它是用 C 编写的 我需要用 C 访问此 DLL 中的函数 在大多数情况下 除了一项功能外 我都可以使用此功能 我遇到问题的函数具