加载 DLL 时出错 - 控制台应用程序 - Visual Studio Community 2022
Posted
技术标签:
【中文标题】加载 DLL 时出错 - 控制台应用程序 - Visual Studio Community 2022【英文标题】:Error loading DLL - Console App - Visual Studio Community 2022 【发布时间】:2022-01-01 08:48:00 【问题描述】:我正在尝试在 Visual Studio Community 2022 中创建的控制台应用程序项目中加载第三方 DLL。环境是 Windows 10。我已尝试过 .NET 5.0 和 6.0
无论我尝试了什么,我都会收到错误“未处理的异常。System.BadImageFormatException: 错误的 IL 格式。文件的格式无效。”
我已经检查过了,通常这个错误是因为我试图在 x86 应用程序中加载 x64 DLL,反之亦然,但我知道情况并非如此,因为:
我已经能够在 C(使用 Codeblocks 中的 LoadLibrary())和 JAVA(使用 JNA)中加载这个特定的 DLL,为 x86 目标平台配置应用程序。我已经为 x86 目标平台以及属性配置了这个控制台应用程序。 加载后的 DLL 开始写入日志文件。日志文件目的地是固定的,不能被停用。每当我运行我的应用程序时,我都会看到正在写入的日志。我意识到正在使用 Sysinternals 的进程监视器写入日志。日志只说
信息:2.23.00 12:14:27(00000015) PCLService.cpp:138 [22.11.2021] 日志创建
INFO: 2.23.00 12:14:27(00000000) PCLService.cpp:141 PDA_Manager: DllMain 附加
INFO: 2.23.00 12:14:27(00000000) PCLService.cpp:145 PDA_Manager: DllMain 分离
通常,分离应该只在 DLL 被卸载/程序关闭时发生。在这里它会自动发生。就像程序无法保持DLL加载一样,给出错误消息。
这是我当前的代码。
using System;
using System.Reflection;
namespace ConsoleApp5
internal class Program
static void Main(string[] args)
//var DLL = Assembly.LoadFile(@"C:\Documentacion\VisaNet\Proyectos\Simpler\bin\Debug\x86\PCLService.dll");
var DLL = Assembly.LoadFrom("PCLService.dll");
Console.ReadLine();
我已经尝试过 LoadFrom() 和 LoadFile()。甚至尝试过Load(),但错误是关于我不知道如何获取的附加信息。
我检查了程序集绑定日志查看器 (fuslogvw.exe) 和进程监视器。我没有发现任何明显的问题。
我假设无论发生什么错误,它确实发生在关于 PCLService.log 的最后 4 个条目的时间,这必须是那些在 DLL 日志中写入关于分离的条目,因为在 Process Monitor 中没有更多关于日志的条目.
虽然我是一名经验丰富的程序员,但我对 Visual Studio / C# 完全陌生
欢迎任何帮助。
【问题讨论】:
Assembly.LoadFrom() 只能用于加载 .NET 程序集。 “PCLService.cpp”给出了一个非常强烈的提示,即这个 DLL 不是这样的程序集,C++ 通常会生成一个只能在 C# 中使用 [DllImport] 的本地 DLL。对于这样的 DLL,你会得到 BadImageFormatException。 无论出于何种原因,每当我搜索“在 C# 中加载 DLL”时,我都会得到关于程序集的结果。正如我所说,我是 C# 的新手,所以虽然我认为它不一样,但我没有看到替代方案。 【参考方案1】:要调用本机 dll,您必须将[DllImport]
与函数原型一起使用。任何Assembly.LoadXXX()
方法仅适用于托管库。也许Using a 32bit or 64bit dll in C# DllImport 会帮助你。
【讨论】:
嗨!我刚刚测试,它似乎工作。非常感谢。它也适用于 C# 6.0 吗?还是另一种方法? @DavidAñez 这个概念适用于任何版本的 C# 直到 1.0。 抱歉,我说错了。我打算使用我看到的所谓的“***语句”,这似乎适用于 .NET 6.0,所以 C# 10.0?所以我想知道如何在那个环境中使用 DllImport,或者是否有等效的方法。 @DavidAñez 我认为从 C# 9.0 开始可以使用***语句。但是,这只是编写Main
方法的一个捷径,完全独立于这里的这个问题。在这种情况下,您应该创建一个(静态)类,其中包含该库所需的所有函数原型。以上是关于加载 DLL 时出错 - 控制台应用程序 - Visual Studio Community 2022的主要内容,如果未能解决你的问题,请参考以下文章
加载 C:\WINDOWS\Update.dll时出错拒绝访问。是怎么回事啊