完整教程:C#用API添另静态路由表
2026-01-18 19:20 tlnshuju 阅读(0) 评论(0) 收藏 举报只要能输出 row.Metric 的有效数值,就证明 C# 的 API 定义和调用逻辑都是正确的
你的 C# 代码中 [DllImport("Iphlpapi.dll")] private static extern int GetIpInterfaceEntry(ref MIB_IPINTERFACE_ROW row); 这个定义完全正确,没有任何错误 —— 它严格对齐了 Windows 原生 GetIpInterfaceEntry API 的规范,也是 C# 调用非托管系统 DLL 的标准写法。
一、先验证:Windows 原生 API 与 C# 定义的匹配性
Windows 官方对 GetIpInterfaceEntry 的 C/C++ 原型定义是:
DWORD GetIpInterfaceEntry(PMIB_IPINTERFACE_ROW pRow
);
拆解对应关系,就能看出 C# 定义的正确性:
| 原生 API 要素 | 含义 | C# 定义对应项 | 匹配性 |
|---|---|---|---|
返回值 DWORD | 32 位无符号整数(错误码:0 = 成功,非 0 = 失败) | int(C# 用 int 兼容 DWORD,无符号→有符号不影响错误码判断) | 完全匹配 |
参数 PMIB_IPINTERFACE_ROW | 指向 MIB_IPINTERFACE_ROW 结构体的指针(入参 + 出参) | ref MIB_IPINTERFACE_ROW row(ref 等价于 C++ 指针,传递结构体地址) | 完全匹配 |
库名 Iphlpapi.dll | API 所在的系统 DLL | DllImport("Iphlpapi.dll") | 完全匹配 |
二、为什么你会觉得 “定义有问题”?(核心误解澄清)
你产生这个疑问,本质是混淆了「API 声明定义」和「API 使用逻辑」两个层面:
| 层面 | C# 代码 | VB6 代码 | 结论 |
|---|---|---|---|
| API 声明 / 定义 | ref + int 返回值,严格对齐原生 API | ByRef(默认) + Long 返回值,声明本身也正确 | 两者的 API 声明都没错,都是对原生 API 的正确映射 |
| API 使用逻辑 | 正确:返回值 = 错误码,从结构体取 Metric | 错误:返回值直接赋值给 Metric,忽略结构体 | VB6 错在 “使用逻辑”,而非 “声明定义” |
简单说:
- C# 的定义和使用都是正确的;
- VB6 的声明是正确的,但使用逻辑(把返回值当 Metric)是错误的;
- 你看到的 “写法不同”,是「API 调用语法」(C# 托管 P/Invoke vs VB6 原生 Declare)的差异,而非「定义对错」的差异。
三、补充:C# 中 ref 的关键作用(为什么不能少?)
ref MIB_IPINTERFACE_ROW row 里的 ref 是核心,少了会直接导致 API 调用失败:
- 无
ref:C# 会把MIB_IPINTERFACE_ROW结构体复制一份传给 API,API 填充的是 “副本”,原变量row不会被修改,永远拿不到接口的 Metric 等信息; - 有
ref:C# 传递的是结构体的内存地址(等价于 C++ 指针),API 直接修改原结构体的内容,才能正确填充 Metric、InterfaceLuid 等字段。
这也是 C# 定义的 “严谨性”—— 显式用 ref 声明 “引用传递”,而 VB6 是默认 ByRef(隐式引用传递),看似写法不同,底层原理完全一致。
四、再回应 “为什么写法不同却都成功”?
- “成功” 的核心是 “核心参数有效”:路由创建 API(
CreateIpForwardEntry)只校验Dest/Mask/NextHop/IfIndex这几个核心参数,只要这些参数正确,哪怕 Metric 错了(VB6 场景),路由依然能创建成功; - API 声明的一致性:C# 和 VB6 的 API 声明都正确指向了原生
GetIpInterfaceEntry,只是 VB6 开发者误解了 “返回值的含义”,但这并不影响 “API 能调用到正确的系统函数”; - 语法差异是语言特性:
- C# 是托管语言,必须通过
DllImport+ref/out显式封装非托管 API; - VB6 是非托管语言,直接
Declare即可调用,参数默认ByRef,语法更简洁但易忽略细节。
- C# 是托管语言,必须通过
五、最终结论
- C# 的
GetIpInterfaceEntry定义无错,是符合 Windows API 规范的标准 P/Invoke 写法; - 你看到的 “写法不同” 是 C# 和 VB6 语言特性导致的语法差异,而非定义错误;
- VB6 的 “成功” 是 “核心参数正确 + Metric 错误不影响创建动作” 的巧合,而非代码逻辑正确。
如果想进一步验证 C# 定义的正确性,可在调用后检查:
// 调用示例
var row = new MIB_IPINTERFACE_ROW();
row.Family = 2; // IPv4
row.InterfaceIndex = ifIndex;
int res = GetIpInterfaceEntry(ref row);
if (res == 0)
{Console.WriteLine($"正确获取Metric:{row.Metric}"); // 能输出有效数值,说明定义正确
}
else
{Console.WriteLine($"API调用失败,错误码:0x{res:X8}");
}
只要能输出 row.Metric 的有效数值,就证明 C# 的 API 定义和调用逻辑都是正确的
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1179187.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
别瞎忙了,你的力气其实很贵
人生下半场:把力气,用在真正重要的地方卸下行囊,看见远方深夜那个突然冒出来的念头嘿,老朋友,咱们先不聊大道理,聊个具体的场景。你有没有过这种时刻? 周五晚上十点多,终于关上电脑&…
消除乱码-UTF8字符转换
编码格式是多样的,既繁华又让人迷惑。针对IUP和GTK而言,正确显示汉字的方法:1. IUP,设置其本身使用 UTF8,然后外部调用时给它UTF8字符;2. GTK,内部使用的是UTF8,直接送UTF8字符给它即…
基于springboot的甘肃非物质文化网站的设计与实现项目源码 java毕设 免费分享
全套项目网盘打包下载:https://pan.quark.cn/s/5ddf68c8d7db项目清单:该系统采用B/S架构,基于SSM框架和MySQL数据库开发,主要包含前端用户系统和后台管理系统两大模块。一、 前台用户系统功能(面向普通访客/会员&#…
使用Dockerfile创建一个hyperf容器做为开发环境
使用Dockerfile创建一个hyperf容器做为开发环境# Default Dockerfile
#
# @link https://www.hyperf.io
# @document https://hyperf.wiki
# @contact group@hyperf.io
# @license https://github.com/hyperf/hy…
COE_Main()代码注释
/////////////////////////////////////////////////////////////////////////////////////////
/*** \brief CoE (CANopen over EtherCAT) 服务主处理函数。* \details 此函数在后台被调用,用于处理挂起的SDO(服务数据对象)读写请求。* …
基于springboot的网上购物商城系统的设计与实现项目源码 java毕设 免费分享
全套项目网盘打包下载:https://pan.quark.cn/s/73b8653a9c85项目清单:本系统是一个包含前台商城和后台管理的多角色电商平台,主要面向用户、商家和管理员三类角色。一、 前台商城功能模块(面向普通用户)1. 公共访问功能…
我读Population Based Training of Neural Networks
原文点此
1.intro
PBT是一种简单的异步优化算法,它能够有效利用固定的计算预算,通过联合优化一组模型和其超参数以最大化性能。
2.methodology
目标是优化模型fff的参数θ\thetaθ以最大化目标函数Q^\hat {\mathcal{Q}}Q^, 实际性能指标Q\mathcal{…
完整教程:腾讯云渠道商:腾讯云轻量服务器和CVM有什么差异?
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
分布式理论的认知重构:CAP 与 BASE 的真相、边界与实践逻辑 - 详解
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
Python中的JSON处理(标准库)
一、什么是JSON?
JSON(JavaScript Object Notation)是一种基于文本的开放标准,用于表示结构化数据。它采用键值对的形式组织数据,支持以下基本数据类型:
字符串(string)数字&#…
Multi-Content GAN for Few-Shot Font Style Transfer(用于少样本字体风格迁移的多内容GAN)
预训练和正式训练,预选练是正式训练的第一阶段但二者损失不同注意:本论文是对字母的风格迁移在未来对汉字进行风格迁移时预训练的笔画划分(或常用字形)可能存在挑战预训练:通过对抗网络对26个字母的平均字形进行学习。…
主流 AI IDE 之一的 Claude Code 介绍
Claude Code 是 Anthropic(Claude AI 的开发公司)于 2025 年推出的代理式(agentic)编码工具,目前被公认为终端里最强的 AI 编程助手之一。它直接运行在你的终端(Terminal / PowerShell / cmd)&a…
两两交换链表中的节点-day04
两两交换链表中的节点
题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/solutions/444474/liang-liang-jiao-huan-lian-biao-zhong-de-jie-di-91/
思路:新建头结点,保存第1结点,第2个结点,第3个结点的…
Mars-Admin 基于Spring Boot 3 + Vue 3 + UniApp的企业级管理系统
Mars-Admin 企业级管理系统
🔥 开箱即用的企业级全栈管理系统 🔥
一套基于 Spring Boot 3 Vue 3 UniApp 的现代化企业管理平台,采用前后端分离架构,提供完整的权限管理、用户管理、移动端支持等功能,是中小企业快速…
2026必备!继续教育TOP9AI论文写作软件测评与推荐
2026必备!继续教育TOP9AI论文写作软件测评与推荐
2026年继续教育AI论文写作工具测评:精准筛选,高效助力学术创作
随着人工智能技术的不断进步,AI论文写作工具在继续教育领域的应用愈发广泛。对于需要撰写论文、发表研究成果的学员…
贵金属回收攻略:本地高价回收不踩坑,今日金价实时更新 - 非研科技
贵金属回收避坑指南:这 3 个套路一定要避开
1. 警惕“高价吸引,低价结算”
部分非正规商家会在网上标注“黄金回收 450 元/克”的超高价,吸引客户到店后,再以“纯度不足”“有磨损”“要扣手续费”等理由压低价格,…
MFC 对话框Alt+F4退出程序实例
MFC 对话框应用程序按AltF4退出程序实现方法
重写OnSysCommand函数
1.添加消息处理函数
在对话框类的头文件(.h)中添加:
protected:virtual void OnSysCommand(UINT nID, LPARAM lParam);DECLARE_MESSAGE_MAP()2.在实现文件(.cpp&…
SonarQube-开源的持续代码质量检测平台
一、SonarQube 核心定义
SonarQube 是一款开源的持续代码质量检测平台,由 SonarSource 公司开发维护。它通过自动化扫描,从代码质量、安全漏洞、可维护性、合规性四大维度对代码进行全方位审查,帮助团队在软件开发生…
AI 模型输出学术内容准确率飙升97%!我只用了这个简单提示词技巧
经常用AI工具辅助学术科研与写作的同仁,可能已经对提示词工程掌握的程度比较深了。为了让模型输出的内容更准确一点,提示词工程师也会研究各种复杂的提示词技巧,比如设定角色、思维链、多样本学习等等。
但最近七哥发现还有一种能提升模型输出内容准确率的方法,该方法出自…