繁体   English   中英

在WinForms应用程序中使用外部DLL需要哪种配置?

[英]Which configuration do I need to use an external DLL in a WinForms application?

我正在使用外部DLL来使用我编写的包装器来使用OCR设备。 我已经对包装器进行了测试,效果很好。 但是,当我使用WinForms项目来使用包装器的客户端类(位于另一个项目)时,调用从DLL导入的C#方法时出现错误(使用[DLLImport(...)] ),说DLL是未注册。

错误说:

“找不到DLL库函数。检查注册表安装路径。”

所有执行都是在调试模式下完成的。 我比较了两个项目的配置。 最相关的区别是Test项目面向Any CPU和WinForms app只指向x86。

会是什么呢?

更新

  1. 我试图使用Regsvr32.exe注册该DLL,但它不起作用。 我想过使用Gacutil.exe但是需要卸载.net framework 1.1以外的所有框架...
  2. 我想知道......在测试环境中,一切都运行良好,因为测试框架有完全在windows中注册的dll或可执行文件(或类似的东西),所以那些是可信赖的dll。 调试生成的dll可能不受Windows信任,因此出现了这个问题?
  3. 我在同一个令人不安的项目中创建了一个表单,然后从我添加到它的按钮调用OCRWrapper。 OCR的工作!! 不幸的是,很难重写第一张表格,因为我们已投入大量时间; 所以,我仍然想知道在令人不安的形式中我需要改变什么......
  4. 我从头开始重新开始表单的开发并添加了与之相关的所有组件; 一切顺利,OCR成功读取所有数据。 当我使用对ObjectContext的调用加载组合框并再次出现错误时...我正在使用连接到Oracle的实体框架。

我有一个理论。

让我们假设以下情况:

  • ocr.dll依赖于其他一些本机DLL,让我们称之为other.dll [A]
  • 您的ADO.NET提供程序使用底层的本机DLL(这对ODP.NET来说确实如此)依赖于other.dll [B] ,它恰好具有相同的名称,但实际上是一个不同的DLL(或者至少是一个不同的DLL)版本)与other.dll相比[A]

然后,在运行时,可能会发生这种情况:

  • 当您连接到数据库时,ADO.NET提供程序动态加载其本机DLL,包括other.dll [B]
  • 然后你尝试从OCR DLL调用一个函数。 P / Invoke尝试动态加载OCR DLL并成功,但是other.dll [B]已经加载,并且ocr.dll尝试使用它的某些功能,而不是从其实际存在的其他文件[A]

欢迎来到DLL地狱。 所以,你可以做什么?

  • 尝试改变对ocr.dll和ADO.NET提供程序的调用顺序,以查看任何更改。 如果你(非常)幸运的话, other.dll [A]可能实际上是一个更新的版本,仍然可以向后兼容other.dll [B]并且奇怪地开始工作。
  • 尝试另一个版本的ADO.NET提供程序。
  • 尝试另一个ADO.NET提供程序。
  • 尝试从您的供应商处获取静态链接的ocr.dll(即没有对other.dll [A]的运行时依赖性)。

因此,对DLL的调用只能从一个按钮进行,但它不适用于复杂的形式。 我会说有一个未定义的行为正在发生。 问题仍然是你是不是写错误的编组,或者编写错误的DLL。

由于我们无法访问DLL的源代码,您可以发布函数的原型,所有相关的结构定义以及您为其编写的DllImport行吗?

谷歌无法找到错误信息,这意味着(不是绝对:) :)它不是系统消息,而是来自dll代码的自定义消息。 所以dll做了一些狡猾的事情。 我想它会尝试在内部将您的调用重新调度到另一个函数。

我建议你尝试的几件事情:

  • 运行x86配置。 在项目属性 - >构建选项卡中,将平台设置为x86。 这假设dll是x86 dll。

    dumpbin / headers orc.dll

      File Type: DLL FILE HEADER VALUES 14C machine (**x86**) 4 number of sections 4CE7B6FC time date stamp Sat Nov 20 11:54:36 2010 0 file pointer to symbol table 0 number of symbols E0 size of optional header 2102 characteristics Executable 32 bit word machine DLL 

这个命令行应该告诉你位数。 如果它是64位运行64位配置,但我敢打赌它是32位。

  • 不要在项目中包含dll。 我想你已经这样做了。 确保dll位于%PATH%环境变量中的文件夹中。 在命令提示符下运行时:

其中ocr.dll

应该告诉你dll在哪里。 如果它没有将安装dll的文件夹添加到%PATH%。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM