解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

这篇具有很好参考价值的文章主要介绍了解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题引入

有几年没有用过VS编程了,最近对Winlicense感兴趣,就试着运行其提供的WinLicenseSDK\ExamplesSDK\Get HardwareID\Proyecto1.sln,遇到DLL引用问题,把解决的过程记录在本文。

我的编译环境是:Win7,64位系统,Visual studio enterprise 2015,.net framework 4.8

WinLicenseSDK目录如下:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

 其下面Lib目录如下:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

 要打开运行的项目如下图:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

双击打开Proyecto1.sln解决方案,内部含VB.net项目Proyecto1.vbproj,如下图:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

最初创建项目时采用的.net framework版本如下:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

该项目会引用WinlicenseSDK.dll,这是非.net开发的dll文件,即非托管代码。

二、DLL相关知识和工具

1、非托管DLL引用

.net项目引用非托管dll有两个方法:

(1)采用Declare,参考演练:调用 Windows API - Visual Basic | Microsoft Docs

(2)参考使用非托管 DLL 函数 - .NET Framework | Microsoft Docs

创建用于容纳 DLL 函数的类 - .NET Framework | Microsoft Docs

 本项目中采用的是第2个方法,即使用DLLImport引入并封装为一个引用类,如下图:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

2、Windows搜索DLL路径

动态链接库搜索顺序 - Win32 apps | Microsoft Docs

以下因素会影响系统是否搜索 DLL:

  • 如果内存中已加载同一模块名称的 DLL,则系统只会在解析到加载的 DLL 之前检查重定向和清单,而不管该 DLL 位于哪个目录中。 系统不搜索 DLL。
  • 如果 DLL 位于运行应用程序的 Windows 版本的已知 DLL 列表中,则系统将使用已知 DLL (的副本和已知 DLL 的依赖 DLL(如果有) ),而不是搜索 DLL。 有关当前系统上的已知 DLL 的列表,请参阅以下注册表项 :HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs。
  • 如果 DLL 具有依赖项,则系统会搜索依赖 DLL,就像它们仅用模块名称加载一样。 即使通过指定完整路径加载了第一个 DLL,也是如此。

桌面应用程序缺省的DLL搜索路径为:

  1. 从其中加载应用程序的目录。
  2. 系统目录。 使用 GetSystemDirectory 函数获取此目录的路径。
  3. 16 位系统目录。 没有函数可获取此目录的路径,但会进行搜索。
  4. Windows 目录。 使用 GetWindowsDirectory 函数获取此目录的路径。
  5. 当前目录。
  6. PATH 环境变量中列出的目录。

注:“加载应用程序的目录”和“当前目录”的区别

举例说明:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

3、查看dll内部函数工具

Visual studio.net安装目录下面的dumpbin.exe和link.exe命令,我机器上安装的是Visual studio.net 2015版,安装目录为C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

dll函数信息导入文件1.txt,打开内容如下:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

 
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin>link /dump /exports C:\V
MWareMachines\share\WinLicenseDemo32_64_3.0.4.0\WinlicenseSDK.dll > 1.txt

和上面的命令效果一样。

为方便今后的使用,为了方便大家,我把相关命令最小集合整理成文件包dlldump,和4、5中提到的工具打包在一起,下载地址: Windows平台DLL工具集1.0-WindowsServer文档类资源-CSDN下载

4、查看系统已注册dll工具

RegDllView1.6 下载地址:Windows平台DLL工具集1.0-WindowsServer文档类资源-CSDN下载

5、查看dll依赖工具

 dependence walker 2.2.6000  下载地址:Windows平台DLL工具集1.0-WindowsServer文档类资源-CSDN下载

二、操作步骤及问题描述

1、直接编译

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

 解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

2、 Debug配置下启动运行

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

 3、点击任一按键

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

 遇到问题如下:

问题1-报告“试图加载格式不正确的程序”

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

 问题1-解决:

在网上找到参考:试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B) - sundajade - 博客园

目前的编译环境是64位系统,而要引用的WinlicenseSDK.dll是32位系统上开发的,需要将编译配置设置为x86即32位模式,如下图:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

 再次启动调试:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

报告问题2-无法加载“WinlicenseSDK.dll” :找不到指定的模块

问题2尝试解决步骤:

尝试在项目里添加显式引用,如下图:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

 报告问题3-未能添加...的引用。请确保此文件可访问并且是一个有效的程序集或COM组件。

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

对于问题2,网上也有说是需要用regsvr32.exe对要引用的dll注册一下,我尝试了没有解决我这个项目的问题。

用法: regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

操作和结果如下:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

 解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

 但结果中提示检查“相关的DLL文件是否有问题”

从   Dependency Walker (depends.exe) Home Page  下载DLL检查工具depends.exe对WinlicenseSDK.dll进行检查,如下图:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

上图显示我的电脑上缺少一些Winlicense.dll会引用到的dll组件。到  https://www.jb51.net/dll/ 下载然后拷贝至项目可执行程序目录下。再次运行,结果如下:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

把WinlicenseSDK.ini也拷贝到可执行程序目录,再次运行则成功,如下图:

解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题

把depends.exe报告的所缺少的那7个dll从可执行程序所在目录删除,重启发现,依然能成功运行。说明WinlicenseSDK.dll并没有真正用到那7个dll。所以真正解决问题起作用的就是修改程序生成运行平台为X86、把WinlicenseSDK.dll和配置文件WinlicenseSDK.ini拷贝到可执行程序目录。

三、结论

1、对于本文所涉及WinlicenseSDK项目除了把配置模式运行平台设置为x86外不需要做其他修改,把WinlicenseSDK.dll和配置文件WinlicenseSDK.ini拷贝到可执行程序目录,便能成功运行。程序开发方说明文档没有说明WinlicenseSDK.dll和配置文件WinlicenseSDK.ini的关系,导致误解其为dll相关生成文件,其实际是dll的配置文件,属于应用程序数据文件。

2、我的电脑Microsoft.net framework版本或某些地方存在问题,导致VS 2015项目不能成功添加dll引用,导致register32注册报错,结果导致关于dll错误处理一顿操作猛如虎,回头一看二百五。

3、问题2、问题3报错的原因以及如何彻底解决,我没有弄明白。

解决这个问题花了一天的时间,网上dll引用报错相关的帖子很多,大多管中窥豹。我的这个demo项目并非真正的dll问题,如果遇到真正的dll问题,需要排查的方面比较多。问题解决后在网上翻到一篇比较靠谱的,推荐给大家,作为本文结束。

无法加载 DLL“xxxx.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。_汪锦鹏的博客-CSDN博客_dll找不到指定的模块

 文章来源地址https://www.toymoban.com/news/detail-440540.html

到了这里,关于解决WinlicenseSDK二次开发Visual Studio项目DLL引用问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Visual Studio Code配置开发Maven项目、Spring Boot项目

    ctrl+shift+p打开搜索setting.json,这个setting.json配置属于全局配置 配置全局的Java与Maven信息 可以在当前项目的.vscode文件夹中,编辑或者创建settings.json,进行Java、Maven配置以此覆盖全局配置。 截至目前,新版本VSCode的Java扩展需要Java 17或更新的版本 如果想使用低版本的JDK,则需

    2024年02月03日
    浏览(44)
  • 用Visual Studio(VS)开发UNIX/Linux项目

    目录 FTP是免不了的 正确设置头文件 组织项目结构 创建何种项目类型 FTP自动上传         大部分具有Windows开发经验的程序员会比较喜欢使用Visual Studio,而大部分Unix/Linux程序员则喜欢使用UltraEdit直接在主机上写代码。         为什么直接在主机上写代码呢,因为主机是没有

    2024年02月08日
    浏览(41)
  • 诊断DLL——Visual Studio安装与dll使用

    官方下载地址:https://visualstudio.microsoft.com/zh-hans/ 本专栏使用 Win10 x64 操作系统安装 Visual Studio 2022 无论是用CANoe还是周立功软件,亦或是Diva自动化测试,都需要加载27服务的安全算法,存在一种载体能够动态修改且被调用的库文件,否则对于无序的安全种子来说,没有太多的

    2024年02月07日
    浏览(87)
  • 解决Visual Studio 各版本都出现新建项目后解决方案下没有文件和项目问题

    一步一步创建C#控制台应用程序也会出错,这个你可能不会相信,我就遇到了这么一次,就在刚刚,是的,我都不敢相信,用了这么多年的新建一个控制台程序居然不正常了。新建完毕发现里面什么都没有,除了一个解决方案名称外什么都没有。 文章原出处: https://blog.csdn

    2023年04月11日
    浏览(83)
  • VSIX:C#项目 重命名所有标识符(Visual Studio扩展开发)

            出于某种目的(合法的,真的合法的,合同上明确指出可以这样做),我准备了一个重命名所有标识符的VS扩展,用来把一个C#库改头换面,在简单的测试项目上工作很满意,所有标识符都被准确替换。我还尝试用在C++项目上,问题就比较多了,因为VS并不能准确识别

    2024年02月05日
    浏览(53)
  • visual studio编写DLL,python调用

    选择第一个c++ DLL, 然后项目源文件下右击新建项,这里名字随便取,在代码中输入一下内容: 在visual studio的项目右击属性 选择不使用编译头,然后点击点击生成解决方案 就可以生成DLL文件了 (PS:前面截图代码忘记添加EXPORT,请参考代码框的代码) 然后python调用即可 如果

    2024年02月09日
    浏览(45)
  • 【解决】屏蔽 Visual Studio 在 C++ 项目中的 C4996 错误

    Visual Studio 2022         由于一些传统C语言函数有一定的安全风险,微软在 Visual Studio 中不建议使用这些传统库函数,否则会提示  C4996  错误。         Visual Studio 建议采用带 _s 的函数,如 scanf _s 、 strcpy _s ,但这些并不是标准C函数。 A、文件内添加抑制         1、

    2024年01月18日
    浏览(43)
  • Visual studio 打开项目MSBuild版本过低问题分析与解决

    一、背景        使用Visual stduio 2019版本打开某个项目,出现MSBuild版本不兼容问题,下图就是实际报错: 二、问题分析         1、示例程序使用的.net sdk版本 6.0.316 ,目标MSBuild版本17.0.0,当前可以用的MSBuild版本16.11.2.50704,也就是版本过低; 三、问题解决         1、按

    2024年02月04日
    浏览(47)
  • visual studio 生成dll文件以及修改输出dll文件名称操作

    Windows系统下Visual Studio可以通过.def文件创建dll。 1.确定需要导出的函数,test.cpp文件中定义如下 2. 添加 .def文件,一般添加到源文件下面。 * 在代码栏下面有一个“模块定义文件”,即我们的.def文件 3.编写test.def文件 文件添加完成,下一步即可设置一些导出规则。 4.在我们的

    2024年02月14日
    浏览(41)
  • Visual Studio中Linux开发头文件intellisense问题的解决办法

    最近在用我心爱的Visual Studio配合WSL2做一些Linux开发,但是有一个问题,就是当我 #include sys/socket.h ,会提示找不到文件 我尝试了各种姿势,包括修改 CMakeSettings.json 下的 remoteCopyAdditionalIncludeDirectories 条目、SSH到WSL然后拉取远程标头,都没有卵用,这期间我在MSDN官方文档、各

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包