【问题标题】:C# DLL run-time error - builds, runs, but throws unhandled exception upon trying to use DLL functionsC# DLL 运行时错误 - 构建、运行,但在尝试使用 DLL 函数时抛出未处理的异常
【发布时间】:2012-01-28 16:40:51
【问题描述】:

我正在尝试为 C# 编译显示为 here 的示例项目。它必须转换为 VS2010,但效果很好。它会构建、运行,但在尝试访问 DLL 函数时会死掉。

我制作了一系列images 来展示我的步骤。如您所见,我设计的设备已连接并正确配置,但我真的认为这与问题无关。在 Form1.cs 文件中,以下注释解释了如何使用 DLL:

/*
PLEASE NOTE
You must add a reference to the FTChipIDNet.dll in order to use this sample
To do this:
1. Click on Solution explorer tab.
2. Right click the References tree.
3. Choose Add Reference option.
4. Browse to the FTChipIDNet.dll (as a personal preference I place this in my bin directory)
5. Click OK
*/

我按照上面显示的说明进行操作,并且修复了对命名空间 FTChipID 的未定义引用。我还手动检查了对象浏览器,以确保 GetNumDevices 函数存在并且确实存在。

单击按钮会产生此错误:

DLLNotFoundException 未处理:

无法加载 DLL 'FTChipID.dll':找不到指定的模块。 (HRESULT 异常:0x8007007E)

在这行代码:

FTChipID.ChipID.GetNumDevices(ref numDevices);

现在,您可能会想“错误表明它需要 FTChipID.dll,而不是 FTChipIDNet.dll。”我想知道同样的事情。我有 FTChipID.dll 以及 .lib 和 .h 文件,但我不知道如何使用它们,也不知道它们需要放在哪里才能让这个程序找到它们。我尝试添加对FTChipID.dll的引用,但是VS2010说

无法添加对 ...\FTChipID.dll 的引用。请确保该文件是可访问的,并且它是一个有效的程序集或 COM 组件。

我也不知道那是什么意思。有任何想法吗?提前致谢。

【问题讨论】:

  • 您是否将 .dll 作为项目参考的一部分添加..?另外,您是否正在使用该 .dll 的命名空间。如果 .dll 是 .net 2.0 - 3.5 .dll 与 .net 4.0 .dll,还请查看该 .dll 的版本控制。或 GAC在项目的属性设置中确保它是一个 4.0 项目我也将尝试将它编译为一个 3.5 项目以及看看有什么区别..
  • 将 FTChipID.dll 添加为项目中的输出(或将其复制到 bin\Debug 文件夹)并重试。我猜 FTChipIDNet.dll 是前者的包装器。
  • 把FTChipID.dll和FTChipIDNET.dll放在同一个目录下。然后框架应该能够找到它。
  • 使用 Project + Add Existing Item 将 DLL 添加到您的项目中。将其 Copy to Output Directory 属性设置为“Copy if newer”。
  • 我将 FTChipID.dll 复制到 bin\Debug 文件夹中。它会产生一些奇怪的行为。在 VS 中运行调试器会做同样的事情——它找不到 FTChipID.dll。但是,在 bin\Debug 文件夹中的 VS2010 之外运行可执行文件会产生一个新错误。 “试图加载格式不正确的程序。(来自 HRESULT 的异常:0x8007000B)。”

标签: c# dll runtime


【解决方案1】:

我在 VS2013 中使用“任何 CPU”的构建构建了 FTDI 示例程序“CSChipID”。将“FTChipID.dll”和“FTChipIDNet.dll”这两个DLL文件复制到bin目录,但在调用第一个DLL函数时,我继续报错,“FTChipID.ChipID.GetNumDevices(ref numDevices);”修复方法是将构建更改为“x86”,如下所示。

构建 - 配置管理器 主动解决方案平台 - “x86” 注意:如果“x86”不可用,选择-New...-选择“x86”。

【讨论】:

  • 是的,谢谢,这也是我的问题的原因,我的 .net 程序有一个调试版本。当我在 Visual Studio x86 和 Release 配置中重建时,它起作用了。这一定是 Visual Studio 编译器的某种问题。 dll 不是问题,因为我的 c:\windows\ 文件夹中已经有 FTchip.dll,而且它之前已经在工作了。
【解决方案2】:

FTChipIDNet.dll 是 FTChipID.dll 的包装器,因此您需要添加对解决方案的引用(如上所述),然后将 FTChipID.dll 复制到 FTChipIDNet.dll 所在的 bin 文件夹中。

这两个 dll 都应位于解决方案的 bin 文件夹中才能运行,而不应位于 windows\system32 中。

【讨论】:

  • 谢谢。这至少产生了一个不同的错误。在将 FTChipID.dll 作为现有项添加到项目后,VS2010 能够在运行调试器时找到它。新错误在我的 OP 下方的评论中。
  • 这里是一个链接,可能对新的错误消息有所帮助。 stackoverflow.com/questions/2023766/…
  • 感谢您的链接。阅读该链接提示我询问 FTDI 是否发布了 64 位版本的 FTChipID.dll。不到20分钟,我收到了回复! “我们目前不提供 64 位版本的 FTChipID.dll。我们的用户编译为 32 位输出,并被告知在 32 位和 64 位系统上运行良好。”所以,看起来我必须使用 32 位版本。 VS2010 Express 不提供该选项,但我会弄清楚那部分。谢谢大家!
  • @Anthony:在项目属性中,将 Target Framework 更改为 32 位 x86。
【解决方案3】:

听起来有多个 .dll:FTChipIDNet.dll(您与之交互的那个)和 FTChipID.dll(具有实际、非 COM、非 .Net 的那个)功能)。两者都需要。

建议:将两者复制到您的 \windows\system32 目录

【讨论】:

  • 你的意思是让他 GAC 两个或两个都复制..?只是好奇你的反应。
  • 应用程序文件很少属于 System32 目录。
  • 是的,这个确实属于 system32 文件夹,可能是因为它是驱动系统的相关部分。请按照原始 FTDI 驱动程序设计将其保留在那里。 C:\windows\System32\FTChipID.dll 我这样说是因为他的邻居 dll 也在那里 C:\windows\System32\ftd2xx.dll
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2015-07-03
  • 2021-03-12
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多