解决同时引用一个dll的多个版本冲突的问题(HslCommunication为例)

本文介绍了如何处理项目中不同版本HslCommunication.dll的冲突,方法包括使用ILMerge工具合并DLL和通过runtime的assemblyBinding设置probingprivatePath。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决同时引用一个dll的多个版本的冲突问题(HslCommunication为例)

Demo地址

代码地址:https://gitee.com/chenheze90/L22_DifferentDLLVersionCompatible
代码zip下载:https://gitee.com/chenheze90/L22_DifferentDLLVersionCompatible/repository/archive/master.zip

背景

最近碰上一个问题,一个项目同时引用的好几个不同版本的dll——HslCommunication.dll。而且这几个dll是互相不兼容的。这就导致了项目无法正常与运行下去。两个版本如下

在这里插入图片描述

在这里插入图片描述

1.dll合并法

首先要先去nuget上下载ILMerge,这个是一个第三方的dll合并组件,详细的教程查看博客:https://blog.youkuaiyun.com/magicchz/article/details/130314669有完整的教学还有demo
在这里插入图片描述
将这个文件的目录记一下,后面会用到

在这里插入图片描述
然后就是修改项目文件,增加以下两行

<Target Name="ILMerge">
    <Exec Command="D:\users\chenhz2\WorkSpace\L22_DifferentDLLVersionCompatible\packages\ILMerge.3.0.41\tools\net452\ILMerge.exe bin\Release\DifferentDLLVersionCompatible.exe /out:bin\Release\DifferentDLLVersionCompatible.exe bin\Release\oldHls\HslCommunication.dll" />
  </Target>
  <Target Name="_ProjectRemoveDependencyFiles" AfterTargets="AfterBuild" DependsOnTargets="ILMerge">
    <ItemGroup>
      <_ProjectDependencyFile Include="bin\Release\HslCommunication.dll" />
      <_ProjectDependencyFile Include="bin\Release\DifferentDLLVersionCompatible.pdb" />
    </ItemGroup>
    <Delete Files="@(_ProjectDependencyFile)" />
  </Target>

如图所示
在这里插入图片描述
右键点击生成即可。我们可以看到生成的exe非常大,2M,这个是合并后的结果
在这里插入图片描述

2.probing方法

新建项目,复制上个例子的代码
在这里插入图片描述
复制新旧两个dll的文件夹过去
在这里插入图片描述
添加引用,然后将HslCommunication引用的复制本地属性改成false。
在这里插入图片描述
然后打开config文件,加上以下代码

<runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="oldHls"/>
      </assemblyBinding>
   </runtime>

在这里插入图片描述

生成项目,可以看到debug下没有HslCommunication.dll
在这里插入图片描述
直接运行exe也可以正常运作

在这里插入图片描述

<think>我们正在使用NModbus库,因此需要引用NModbus的命名空间 根据引用[1]中的示,使用了`Modbus.Device`命名空间 另外,根据NModbus的文档,可能还需要其他命名空间,如`NModbus`(用于工厂模式)和`NModbus.IO`(用于TCP适配器) 在Unity中,我们通常使用以下方式引用: 1. 首先确保已将NModbus库导入到Unity项目中(将源码放在Assets文件夹下或通过NuGet for Unity安装) 2.C#脚本顶部使用`using`语句引用必要的命名空间 根据不同的使用方式,可能需要引用的命名空间包括: - `NModbus`:核心功能,如`IModbusFactory`, `ModbusFactory`等 - `NModbus.IO`:用于TCP通信的适配器,如`TcpClientAdapter` - `NModbus.Utility`:包含一些实用工具(如字节处理) 另外,在引用[1]中使用了`Modbus.Device`,这是旧版NModbus的命名空间,在新版中已经改变。 因此,我们应使用新版NModbus的命名空间。 以下是Unity脚本中常见的命名空间引用: ```csharp using NModbus; // 核心Modbus功能 using NModbus.IO; // 用于网络通信的适配器 using System; // 用于异常处理等 using System.Net.Sockets; // 如果需要直接使用TcpClient(但NModbus封装了) using UnityEngine; // Unity基础 using System.Collections; // 协程需要 ``` 具体到代码,我们之前使用的是: - `NModbus.IModbusMaster` - `NModbus.ModbusFactory` - `NModbus.IO.TcpClientAdapter` 因此,正确的引用方式是在脚本顶部添加: ```csharp using NModbus; using NModbus.IO; ``` 另外,在引用[2]中提到了另一个HslCommunication,如果使用该库,则引用命名空间为: - `HslCommunication` - `HslCommunication.ModBus` 但根据用户问题,我们主要讨论NModbus。 总结:在Unity C#脚本中,为了使用Modbus TCP库(NModbus),需要引用以下命名空间: - `NModbus` - `NModbus.IO` 如果使用其他库,则引用相应的命名空间。 注意:在Unity中使用外部库时,确保库与Unity的.NET兼容性(通常使用.NET Standard 2.0或.NET 4.x的库)。</think>在C#引用Modbus TCP库的命名空间取决于您使用的具体库。以下是两种常见库的引用方式: ### 1. 使用 NModbus 库(推荐) 这是最常用的开源Modbus库,引用方式如下: ```csharp // 核心命名空间 using NModbus; using NModbus.IO; using NModbus.Device; // 使用示 public class ModbusReader { public void ReadData() { // 创建TCP客户端 var client = new TcpClientAdapter("192.168.1.10", 502); // 创建Modbus主站 IModbusFactory factory = new ModbusFactory(); IModbusMaster master = factory.CreateMaster(client); // 读取寄存器 ushort[] values = master.ReadHoldingRegisters(1, 0, 10); } } ``` ### 2. 使用 HslCommunication 库 这是另一个常用的工业通信库,引用方式如下: ```csharp // HSL库命名空间 using HslCommunication; using HslCommunication.ModBus; // 使用示 public class ModbusReader { public void ReadData() { // 创建Modbus TCP对象 ModbusTcpNet modbus = new ModbusTcpNet("192.168.1.10", 502, 1); // 连接PLC OperateResult connectResult = modbus.ConnectServer(); if(connectResult.IsSuccess) { // 读取寄存器 OperateResult<ushort[]> readResult = modbus.ReadUInt16("100", 10); } } } ``` ### 关键区别: | **功能** | **NModbus** | **HslCommunication** | |------------------|--------------------------------|--------------------------------| | 创建连接 | `TcpClientAdapter` + `ModbusFactory` | `ModbusTcpNet`构造函数 | | 读取寄存器 | `ReadHoldingRegisters()` | `ReadUInt16()` | | 错误处理 | 标准异常处理 | `OperateResult`返回值 | | 连接状态检查 | `IsConnected`属性 | `ConnectServer()`返回值 | ### 最佳实践建议: 1. **库安装**: - NModbus:通过NuGet安装`NModbus4`包 - HslCommunication:下载DLL或通过NuGet安装`HslCommunication`包 2. **Unity特殊配置**: ```csharp // 在Unity中需在Start()方法初始化 void Start() { // 使用协程避免阻塞主线程 StartCoroutine(ReadPLCData()); } IEnumerator ReadPLCData() { while(true) { // 读取逻辑... yield return new WaitForSeconds(0.5f); } } ``` 3. **命名空间冲突处理**: ```csharp // 如果存在命名冲突 using Modbus = NModbus; // 别名 // 使用 Modbus.IModbusMaster master = ...; ``` 对于大多数Unity应用,推荐使用**NModbus**库,它更轻量且文档完善。HslCommunication提供了更多工业协议支持,但包体积较大[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值