首页 文章

C到C#,C#到C与外部DLL,DLL未找到异常

提问于
浏览
0

Background:

  • C( without libraries / DLL(第三方)和C代码调用它们)作为C#调用的Dll是 working .

  • C( with libraries / Dlls(第三方)和使用它们的C代码)作为C调用的Dll是 working .

  • C( with libraries / Dlls(第三方)和使用它们的C代码)作为C#调用的Dll是 not working .

第3个案例我遇到了Dll未找到异常 . 我只是评论/取消注释我的代码包含或排除我的C Dll的Dll和库因此可以找到Dll

  • 第三方Dll和库是由C使用的,实际上是测试OCR .

Summary of problem:

1st case 已经显示我的Dll路径是正确的并且可以找到dll并且设置正确,这样我可以通过C#使用C dll .

2nd case 表明我的Dll本身没有错误 .

3rd case1st and 2nd cases 相矛盾 .

请赐教,提前一百万谢!

P.S . :我没有包含代码,因为我不确定问题是否明显(对您的专业人士而言) . 如果不是,我可以编辑包含最小的示例代码 .

Update 1:

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

以下是我的Dll的设置(我没有足够的声誉来发布图像,因此这是链接) .

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

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

Update 2:

发现可以找到libs但是在实例化其中一个类(第三方)时失败,

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

显然我们需要做this

Status: 使用了另一种选择(由一些慷慨和有才华的家伙包裹的tesseract,即第三方类可以直接在C#中使用) . 在生活中进行 . 有时间会尝试解决这个问题 .

3 回答

  • 1

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

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

    第二种方式(通常除了文件名之外通常不使用任何路径)是使用 LoadLibrary 的最常用方法,如果's the case, then just as a test, I'尝试以管理员身份运行该进程并在 PATH 环境变量上复制所需的库( \Windows\System32\ 可能是一个好的方法)选择仅用于测试 - 如果它们不打算去那里,请记得删除它们 .

    如果这样做,那么将所有必需的库复制到可执行文件夹更可能是一个问题 .

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

  • 0

    我只能猜测这个问题 . 我最初会说问题是你的第三方lib使用的一个依赖dll,一个由你的C调用程序提供的,当你的C#程序调用时它不存在 .

    例如 . 如果您的dll调用第三方dll,并且它又调用dll,例如c运行时库或其他一些dll,则此依赖dll可能不会出现在为C#构建的环境中 . “未找到dll”异常可能是指依赖关系,而不是您的dll .

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

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

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

  • 1

    当无法加载с依赖关系时,您也可以获得 DllNotFoundException . 所以在第三种情况下(如果它在不同的机器上运行),您可能没有安装某些依赖项 .

相关问题