我正在使用外部DLL来使用我编写的包装器来使用OCR设备。我已经对包装器进行了测试,效果很好。但是,当我使用WinForms项目来使用包装器的客户端类(位于另一个项目中)时,在调用从DLL导入的C#方法(使用[DLLImport(...)]
)时会出现错误,表明DLL未注册。
错误说:
“找不到DLL库函数。检查注册表安装路径。”
所有执行都是在调试模式下完成的。 我比较了两个项目的配置。最相关的区别是Test项目面向Any CPU和WinForms app只指向x86。
它可能是什么?
更新
Regsvr32.exe
注册dll,但它不起作用。我考虑过使用Gacutil.exe
,但需要卸载.net framework 1.1 ... ObjectContext
的调用加载组合框并且再次出现错误时...我正在使用连接到Oracle的实体框架。答案 0 :(得分:1)
我有一个理论。
让我们假设以下情况:
然后,在运行时,可能会发生这种情况:
欢迎来到DLL地狱。那你能做什么?
答案 1 :(得分:0)
因此,对DLL的调用只能从一个按钮进行,但它不能从复杂的形式开始工作。我会说有一个未定义的行为正在发生。问题仍然是你,是不是写错误的编组,还是写得不好的DLL。
由于我们无法访问DLL的源代码,您可以发布函数的原型,所有相关的结构定义以及您为其编写的DllImport行吗?
答案 2 :(得分:0)
Google无法找到错误消息,这意味着(不是绝对:) :)它不是系统消息,而是来自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位。
其中ocr.dll
应该告诉你dll在哪里。如果它没有将安装dll的文件夹添加到%PATH%。