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

在C#中调用C语言DLL持续失败,求问题排查与解决

C#调用C语言DLL的常见问题排查

问题背景

正在学习从64位C#应用调用64位C语言DLL,参照官方文档示例操作时,先后遇到两类错误:

第一阶段错误:System.BadImageFormatException

运行编译后的cm.exe时触发错误:

Unhandled Exception: System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

使用的C语言DLL代码:

// cmdll.c
// 编译命令:-LD ("cl -LD cmdll.c")
int __declspec(dllexport) SampleMethod(int i)
{
  return i*10;
}

C#可执行程序代码(与DLL放置在同一目录):

// cm.cs (编译命令:"csc cm.cs")
using System;
using System.Runtime.InteropServices;
public class MainClass
{
    [DllImport("Cmdll.dll")]
      public static extern int SampleMethod(int x);

    static void Main()
    {
        Console.WriteLine("SampleMethod() returns {0}.", SampleMethod(5));
    }
}

第二阶段更新:切换64位运行后触发System.DllNotFoundException

在Visual Studio 2022中以64位模式运行cm应用,出现新错误:

System.DllNotFoundException: 'Unable to load DLL 'Cmdll.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)'


问题分析与解决方案

针对System.BadImageFormatException的排查

这个错误的核心是编译产物位数不匹配:

  • 即便你声明环境是64位,默认编译命令可能生成了不同位数的文件:32位版本的cl编译器会输出32位DLL,若C#程序默认编译为64位,就会触发格式不兼容错误;反之亦然。

解决步骤:

  1. 打开64位专属的VS命令提示符(如「x64 Native Tools Command Prompt for VS 2022」),确保使用64位编译环境。
  2. 编译C DLL时强制指定64位目标:执行命令 cl /LD /x64 cmdll.c。
  3. 编译C#程序时也明确指定64位:执行命令 csc /platform:x64 cm.cs,避免Any CPU模式在特殊环境下自动切换为32位。

针对System.DllNotFoundException的排查

切换64位后找不到DLL,可能的原因及解决方法:

  1. 路径匹配问题:
    • 确认64位版本的Cmdll.dll被复制到C#程序的输出目录(如VS项目的bin\x64\Debug或Release文件夹),而非保留原来的32位DLL。
    • 在VS中运行时,可将DLL添加为项目内容,设置「复制到输出目录」为「始终复制」,确保编译时自动同步到输出路径。
  2. 依赖库缺失:
    • 64位C DLL可能依赖64位VC运行时库(如vcruntime140.dll),若系统未安装对应版本的64位Visual C++ Redistributable,会导致DLL加载失败,需安装匹配版本的运行时组件。
  3. 文件名大小写问题:
    • 确认[DllImport]中的"Cmdll.dll"与实际生成的DLL文件名完全一致(Windows文件系统虽不区分大小写,但部分场景下会因大小写差异导致加载失败)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:37:38