2017-08-08 84 views
0

我正在开发一个应用程序(C#winforms),它依赖于供应商提供的与硬件通信的DLL。.NET目标框架如何影响第三方DLL的加载?

如果让我选择.NET 4中(或其他更高)的目标框架,我得到尝试调用的参考DLL的方法当出现以下消息:

DllNotFoundException:无法加载DLL“somelibrary .dll':对内存位置的访问无效。 (来自HRESULT的异常:0x800703E6)

如果我选择.NET 2.0或3.0的目标框架,则不会发生该错误。

我怀疑存在不兼容性或库比.NET 3.0早。

这很可能是由于.DLL启动了一个可执行文件,它充当应用程序和串口之间的通信处理程序。我曾尝试将该应用程序设置为使用各种兼容模式,并以管理员身份运行,但未成功。

我能做些什么来避免这个错误,并针对更现代的.NET平台,如4.5或更高版本? (或者我是否因为使用了一个潜在的老DLL而被卡住了?)

应用程序平台目标是x86,我正在使用默认设置的UAC在Win7 x64上开发。

+0

是否您尝试加载的.net程序集?你有没有试过用'ildasm.exe'打开它?是否有'fuslogwv.exe'提供的其他信息? – ironstone13

+0

@ ironstone13我会进一步调查你所建议的工具。我不确定装配的类型。 – JYelton

回答

1

我不认为这是100%正确的解决方案,但这里有个想法,我认为是有效的。

当您缺少依赖关系时,通常会发生此错误。在您的案例依赖关系为您的somelibrary.dll。在FW2.0中,大多数文件都存储在一些Program files (x86)\Reference Assemblies...中。我们知道有些事情在FW4 +中发生了变化,一些类被移走了,程序集不再在Program Files中,而是通过Nuget下载。因此,当你的目标是FW4.0 +时,你的应用开始寻找v4.0的依赖关系。我会使用一些反汇编程序,如免费的dotPeek,查看您在该DLL中引用的内容。然后我会尝试在机器上找到这些内容,看看您是否没有与命名空间相关的版本冲突

+0

感谢您的回答/建议。我对dotPeek并不熟悉,因此我会调查并了解它是否提供了任何见解。 – JYelton

+0

@JYelton只需google JetBrains dotPeek。 JetBrains是一家值得信赖的公司,拥有一系列.net的重要工具,比如'resharper'。下载它,安装它并使用该程序打开DLL。或者你可以使用类似'NDepend'的东西。当然,有很多工具可以做到这一点。但dotPeek也是一个反射器。你可以看到里面的代码。除非你有DLL被混淆。然后dotPeek没有什么帮助。但我不知道依赖查看器是否可以在混淆的DLL中看到引用 –