You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell中导入C DLL及头文件?Add-Type无法正常使用

在PowerShell中调用C DLL并处理头文件内容的方法

没问题!在PowerShell里确实没办法直接像C/C++那样导入头文件,但我们可以通过**P/Invoke(平台调用)**结合Add-Type来间接实现调用C DLL的功能——核心思路是把C头文件里的函数、结构体、常量等转换成C#的平台调用定义,再编译成.NET类型供PowerShell使用。下面一步步给你讲:

1. 基础:调用DLL中的简单函数

假设你的C头文件(比如test.h)里有这样的函数声明:

int Add(int num1, int num2);

对应的DLL是test.dll,我们需要把这个声明转换成C#的P/Invoke代码,再用Add-Type编译:

# 定义包含P/Invoke代码的C#类型
$typeCode = @"
using System;
using System.Runtime.InteropServices;

public static class MyDllHelper
{
    // 匹配C DLL里的函数,注意调用约定(C默认是Cdecl)
    [DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int Add(int num1, int num2);
}
"@

# 编译这段代码成.NET类型
Add-Type -TypeDefinition $typeCode

# 现在就可以调用函数了
[MyDllHelper]::Add(5, 7)  # 输出应该是12

2. 处理头文件里的结构体和常量

如果头文件里有结构体、宏定义这类内容,也需要转换成对应的C#结构:
比如头文件里的内容:

typedef struct {
int X;
int Y;
} Point;

#define MAX_COORDINATE 1000

int CalculateDistance(Point p1, Point p2);

转换成C#代码并编译:

$typeCode = @"
using System;
using System.Runtime.InteropServices;

// 对应C的Point结构体
public struct Point
{
    public int X;
    public int Y;
}

public static class MyDllHelper
{
    // 对应宏定义的常量
    public const int MAX_COORDINATE = 1000;

    [DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int CalculateDistance(Point p1, Point p2);
}
"@

Add-Type -TypeDefinition $typeCode

# 使用示例
$pointA = [Point]@{X=0; Y=0}
$pointB = [Point]@{X=3; Y=4}
[MyDllHelper]::CalculateDistance($pointA, $pointB)  # 输出5

3. 常见问题排查(解决你用Add-Type失败的可能)

  • DLL路径问题:如果DLL不在当前目录或系统PATH里,要写绝对路径,比如DllImport(@"C:\Projects\test.dll")
  • 调用约定不匹配:C默认用Cdecl,Windows API常用StdCall,如果调用约定错了会导致崩溃或返回错误值,一定要和DLL里的函数一致
  • 数据类型不匹配:比如C的char*对应C#的string或IntPtr(要看函数是输入还是输出),unsigned int对应uint,必须严格匹配
  • 位数兼容性:64位PowerShell只能调用64位DLL,32位PowerShell只能调用32位DLL,交叉调用会报错

内容的提问来源于stack exchange,提问作者Archie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:59:04