背景:


由C#调用的Dll的C ++(没有库/ DLL(第三方)和C ++代码调用它们)正在工作。
C ++(带有库/ Dlls(第三方)和使用它们的C ++代码)正在像C ++调用的Dll一样工作。
由C#调用的Dll的C ++(带有库/ Dlls(第三方)和使用它们的C ++代码)不起作用。


我遇到第三种情况的Dll找不到异常。
我只是在注释/取消注释我的代码以包含或排除C ++ Dll的Dll和库,因此应该可以找到Dll


第三方Dll和库旨在由C ++使用,实际上是tesseract OCR。


问题总结:

第一种情况表明,我的Dll路径正确,并且可以找到dll,并且安装程序正确,这样我就可以通过C#使用C ++ dll。

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

第三案与第一案和第二案相矛盾。

请赐教,一百万个谢谢!!

附注:我未包含代码,因为我不确定问题是否很明显(对您的专业人员而言)。如果没有,我可以进行编辑以包含最少的示例代码。

更新1:

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

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

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

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

更新2:

发现可以找到这些库,但是在实例化该类(第3方)时失败,

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


显然,我们需要做this

状态:已使用另一种方法(某些慷慨且有才华的人包裹了tesseract,即可以在C#中直接使用3rd party类)。在生活中前进。有时间时,将尝试解决此问题。

最佳答案

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

如果是这样,则需要检查DLL如何访问那些第三方DLL ...如果是通过调用LoadLibrary进行的,则需要检查第三方库是否正确可以定位的路径:


如果使用完整路径调用LoadLibrary,则仅在此处搜索库
如果使用相对路径调用它,请确保可以将其放置在该位置(并且被调用者有足够的权限来加载它)。查看http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx上的备注以获取搜索策略


第二种方法(通常只使用文件名,根本不使用路径)是使用LoadLibrary的最常见方法,如果是这种情况,那么作为测试,我将尝试以管理员身份运行该过程并复制所需的库PATH环境变量上的某个位置(\Windows\System32\可能只是用于测试的不错选择-请记住,如果不打算将其删除,请稍后将其删除)。

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

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

09-10 13:20
查看更多