【问题标题】:C++ to C#, C# to C++ with external DLLs, DLL not found exceptionC++ 到 C#,C# 到 C++ 与外部 DLL,DLL 未找到异常
【发布时间】:2025-11-21 15:40:02
【问题描述】:

背景:

  1. C++(没有库/DLL(第 3 方)和调用它们的 C++ 代码)作为 C# 调用的 Dll工作
  2. C++(带有库/Dlls(第 3 方)和使用它们的 C++ 代码)作为 C++ 调用的 Dll工作
  3. C++(带有库/Dlls(第 3 方)和使用它们的 C++ 代码)作为 C# 调用的 Dll不工作

我遇到了第三种情况的 Dll not found 异常。 我只是在评论/取消评论我的代码以包含或排除我的 C++ Dll 的 Dll 和库,因此据说可以找到 Dll

  • 第 3 方 Dll 和库是为 C++ 使用的,实际上是 tesseract OCR。

问题总结:

第一种情况表明我的 Dll 路径是正确的,并且可以找到 dll 并且设置正确,因此我可以通过 C# 使用 C++ dll。

第二种情况表明我的 Dll 本身没有错误。

第三种情况第一种和第二种情况相矛盾。

请赐教,一百万提前谢谢!

P.S.:我没有包含代码,因为我不确定问题是否显而易见(对您来说是专业人士)。如果不是,我可以进行编辑以包含最少的示例代码。

更新 1:

参考建议的解决方案,我尝试将每个依赖项放在 1 个文件夹下,但它不起作用。很可能是我做错了。

以下是我的 Dll 的设置(我没有足够的声誉在此处发布图片,因此这是链接)。

http://postimg.org/image/v4cau3b2d/

您能否建议如何构建“依赖文件夹”以便 C# 可以找到它?

更新 2:

发现库可以定位,但在实例化类之一(第 3 方)时失败,

class TESS_API TessBaseAPI {
 public:
  TessBaseAPI();// failed here, why?
}

显然我们需要做this

状态: 使用了替代方法(由一些慷慨和有才华的人包装的 tesseract,即 3rd 方类可以直接在 C# 中使用)。在生活中进行。有时间会尝试解决这个问题。

【问题讨论】:

  • LibrariesDLLs 是相同的(DLL = 动态链接库),所以请澄清你的问题......你不能拥有(如第 1 点):“C++ without库,但带有 dll"
  • 好的,为了正确起见,.lib 文件是静态链接库。同样适用...通常当有一个小的 .lib 文件和一个 DLL 时,.lib 只是 DLL 中外部函数的定义,但是你有两个库,而不仅仅是一个(它不像“如果链接动态它不是一个库")
  • .lib 文件用于静态链接(例如,它们的内容在您的 dll 中编译),因此如果您有具有相同代码的 dll,则不必将 .lib 文件放在输出中。

标签: c# c++ dll


【解决方案1】:

我从您的问题中得到的怀疑是,您自己的使用第三方动态链接库的 DLL 没有找到那些第三方 DLL。

如果是这样,您需要检查 DLL 是如何访问这些第三方 DLL... 如果是通过调用 LoadLibrary,那么您需要检查第三方库是否是在可以找到的正确路径中:

第二种方式(通常不使用路径,只使用文件名)是使用LoadLibrary的最常见方式,如果是这种情况,那么作为测试,我会尝试以管理员身份运行该进程并复制PATH 环境变量中某处所需的库(\Windows\System32\ 仅用于测试可能是一个不错的选择 - 如果它们不打算去那里,请记住在之后删除它们)。

如果这可行,那么将所有必需的库复制到可执行文件夹时更有可能出现问题。

另外,请注意在 Visual Studio 中运行可执行文件(通过 F5 调试或通过 Ctrl+F5 运行)不会使可执行文件夹成为当前文件夹工作目录。如果您已将所有必需的 DLL 复制到 bin 输出文件夹,请尝试使用资源管理器直接从那里运行您的可执行文件,看看是否有效。

【讨论】:

    【解决方案2】:

    我只能猜测这个问题。我最初会说问题是您的第 3 方库使用的依赖 dll,该库由您的 C++ 调用程序提供,在您的 C# 程序调用时不存在。

    例如。如果您的 dll 调用了第 3 方 dll,而它又调用了诸如 c 运行时库或其他一些 dll 之类的 dll,那么这个依赖 dll 可能不会出现在为 C# 构建的环境中。 “找不到dll”异常可能指的是依赖项,而不是您的dll。

    检查这一点的一种方法是将步骤 2 中使用的所有 dll 复制到 C# 目录中并再次运行它(或者使用 Dependency Viewer,如果你能找到 Microsoft 在更高版本的 VS 中隐藏它的位置)。

    我认为最可能的原因是一些非常微不足道和明显的事情......您需要让其他人检查您的运行时环境,他们很可能会立即指出一个非常愚蠢的错误。 (或者这只会发生在我身上!)

    编辑:快速附录,您是否在 64 位机器上以“所有 CPU”模式运行您的 C# 程序,并且第 3 方库是 32 位的? (或这个主题的一些变化)。这也可能导致问题。

    【讨论】:

      【解决方案3】:

      当您的 с++ 依赖项的 с++ 依赖项无法加载时,您也可以获得DllNotFoundException。所以在第三种情况下(如果它在单独的机器上运行),你可能还没有安装一些依赖项。

      【讨论】: