diff --git a/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj b/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj
index 86df934..8194029 100644
--- a/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj
+++ b/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj
@@ -5,7 +5,7 @@
Modbus.Net.Core
Modbus.Net
Modbus.Net.Core
- 1.3.9
+ 1.4.0
Modbus.Net
Chris L.(Luo Sheng)
Hangzhou Delian IoT Science Technology Co.,Ltd.
@@ -52,6 +52,7 @@
+
diff --git a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj
index 0a9cd54..215e34f 100644
--- a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj
+++ b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj
@@ -5,7 +5,7 @@
Modbus.Net.Modbus
Modbus.Net.Modbus
Modbus.Net.Modbus
- 1.3.9
+ 1.4.0
Chris L.(Luo Sheng)
Hangzhou Delian IoT Science Technology Co.,Ltd.
Modbus.Net.Modbus
diff --git a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj
index b44303a..8fa1f47 100644
--- a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj
+++ b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj
@@ -5,7 +5,7 @@
Modbus.Net.OPC
Modbus.Net.OPC
Modbus.Net.OPC
- 1.3.9
+ 1.4.0
Chris L.(Luo Sheng)
Hangzhou Delian IoT Science Technology Co.,Ltd.
Modbus.Net OPC Implementation
diff --git a/Modbus.Net/Modbus.Net.OPC/OpcProtocal.cs b/Modbus.Net/Modbus.Net.OPC/OpcProtocal.cs
index 30c2501..3d9f543 100644
--- a/Modbus.Net/Modbus.Net.OPC/OpcProtocal.cs
+++ b/Modbus.Net/Modbus.Net.OPC/OpcProtocal.cs
@@ -3,7 +3,9 @@
///
/// Opc协议
///
- public abstract class OpcProtocal : BaseProtocal>
+ public abstract class OpcProtocal : BaseProtocal,
+ PipeUnit,
+ ProtocalUnit>>
{
///
/// 构造函数
diff --git a/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs b/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs
index ea72ded..c469572 100644
--- a/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs
+++ b/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs
@@ -7,7 +7,9 @@ namespace Modbus.Net.OPC
///
/// Opc通用Api入口
///
- public abstract class OpcUtility : BaseUtility>
+ public abstract class OpcUtility : BaseUtility,
+ PipeUnit,
+ ProtocalUnit>>
{
///
/// 获取分隔符
@@ -80,7 +82,8 @@ namespace Modbus.Net.OPC
try
{
var split = GetSeperator?.Invoke() ?? '/';
- var writeRequestOpcInputStruct = new WriteRequestOpcInputStruct(startAddress.Split('\r'), split, setContents[0]);
+ var writeRequestOpcInputStruct =
+ new WriteRequestOpcInputStruct(startAddress.Split('\r'), split, setContents[0]);
var writeRequestOpcOutputStruct =
await
Wrapper.SendReceiveAsync(Wrapper[typeof(WriteRequestOpcProtocal)],
diff --git a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj
index 13cf6d5..7abcf74 100644
--- a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj
+++ b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj
@@ -5,7 +5,7 @@
Modbus.Net.Siemens
Modbus.Net.Siemens
Modbus.Net.Siemens
- 1.3.9
+ 1.4.0
Chris L.(Luo Sheng)
Hangzhou Delian IoT Science Technology Co.,Ltd.
Modbus.Net Siemens Profinet Implementation
diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocal.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocal.cs
index 269bcd0..fe51273 100644
--- a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocal.cs
+++ b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocal.cs
@@ -37,7 +37,7 @@ namespace Modbus.Net.Siemens
///
/// 写入的内容,使用对象数组描述
/// 从设备获取的字节流
- public override byte[] SendReceive(params object[] content)
+ public override PipeUnit SendReceive(params object[] content)
{
return AsyncHelper.RunSync(() => SendReceiveAsync(Endian, content));
}
@@ -47,7 +47,7 @@ namespace Modbus.Net.Siemens
///
/// 写入的内容,使用对象数组描述
/// 从设备获取的字节流
- public override async Task SendReceiveAsync(params object[] content)
+ public override async Task SendReceiveAsync(params object[] content)
{
if (ProtocalLinker == null || !ProtocalLinker.IsConnected)
await ConnectAsync();
@@ -60,7 +60,7 @@ namespace Modbus.Net.Siemens
/// 协议核心
/// 协议的参数
/// 设备返回的信息
- private async Task ForceSendReceiveAsync(ProtocalUnit unit, IInputStruct content)
+ private async Task ForceSendReceiveAsync(ProtocalUnit unit, IInputStruct content)
{
return await base.SendReceiveAsync(unit, content);
}
@@ -83,21 +83,14 @@ namespace Modbus.Net.Siemens
ProtocalLinker = new SiemensPpiProtocalLinker(_com, SlaveAddress);
var inputStruct = new ComCreateReferenceSiemensInputStruct(SlaveAddress, MasterAddress);
var outputStruct =
- await await
+ (await (await
ForceSendReceiveAsync(this[typeof(ComCreateReferenceSiemensProtocal)],
- inputStruct).
- ContinueWith(async answer =>
- {
- if (!ProtocalLinker.IsConnected) return false;
- var inputStruct2 = new ComConfirmMessageSiemensInputStruct(SlaveAddress, MasterAddress);
- var outputStruct2 =
- (ComConfirmMessageSiemensOutputStruct)
- await
- ForceSendReceiveAsync(this[typeof(ComConfirmMessageSiemensProtocal)],
- inputStruct2);
- return outputStruct2 != null;
- });
- return outputStruct;
+ inputStruct)).
+ SendReceiveAsync(this[typeof(ComConfirmMessageSiemensProtocal)], answer =>
+
+ new ComConfirmMessageSiemensInputStruct(SlaveAddress, MasterAddress)
+ )).Unwrap();
+ return outputStruct != null;
}
}
}
\ No newline at end of file
diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs
index c5d8c09..1ced049 100644
--- a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs
+++ b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs
@@ -81,7 +81,7 @@ namespace Modbus.Net.Siemens
///
/// 发送的数据
/// 返回的数据
- public override byte[] SendReceive(params object[] content)
+ public override PipeUnit SendReceive(params object[] content)
{
return AsyncHelper.RunSync(() => SendReceiveAsync(Endian, content));
}
@@ -91,7 +91,7 @@ namespace Modbus.Net.Siemens
///
/// 发送的数据
/// 返回的数据
- public override async Task SendReceiveAsync(params object[] content)
+ public override async Task SendReceiveAsync(params object[] content)
{
if (ProtocalLinker == null || !ProtocalLinker.IsConnected)
await ConnectAsync();
@@ -104,7 +104,7 @@ namespace Modbus.Net.Siemens
/// 协议的核心
/// 协议的参数
/// 返回的数据
- public override IOutputStruct SendReceive(ProtocalUnit unit, IInputStruct content)
+ public override PipeUnit SendReceive(ProtocalUnit unit, IInputStruct content)
{
return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content));
}
@@ -115,15 +115,14 @@ namespace Modbus.Net.Siemens
/// 发送的数据
/// 协议的参数
/// 返回的数据
- public override async Task SendReceiveAsync(ProtocalUnit unit, IInputStruct content)
+ public override async Task SendReceiveAsync(ProtocalUnit unit, IInputStruct content)
{
if (ProtocalLinker != null && ProtocalLinker.IsConnected) return await base.SendReceiveAsync(unit, content);
if (_connectTryCount > 10) return null;
return
await
- await
- ConnectAsync()
- .ContinueWith(answer => answer.Result ? base.SendReceiveAsync(unit, content) : null);
+ ConnectAsync()
+ .ContinueWith(answer => answer.Result ? base.SendReceiveAsync(unit, content) : null).Unwrap();
}
///
@@ -132,7 +131,7 @@ namespace Modbus.Net.Siemens
/// 发送的数据
/// 协议的参数
/// 返回的数据
- private async Task ForceSendReceiveAsync(ProtocalUnit unit, IInputStruct content)
+ private async Task ForceSendReceiveAsync(ProtocalUnit unit, IInputStruct content)
{
return await base.SendReceiveAsync(unit, content);
}
@@ -157,23 +156,15 @@ namespace Modbus.Net.Siemens
if (!await ProtocalLinker.ConnectAsync()) return false;
_connectTryCount = 0;
var inputStruct = new CreateReferenceSiemensInputStruct(_tdpuSize, _taspSrc, _tsapDst);
- return
+ var outputStruct =
//先建立连接,然后建立设备的引用
- await await
- ForceSendReceiveAsync(this[typeof(CreateReferenceSiemensProtocal)], inputStruct)
- .ContinueWith(async answer =>
- {
- if (!ProtocalLinker.IsConnected) return false;
- var inputStruct2 = new EstablishAssociationSiemensInputStruct(0x0101, _maxCalling,
- _maxCalled,
- _maxPdu);
- var outputStruct2 =
- (EstablishAssociationSiemensOutputStruct)
- await
- SendReceiveAsync(this[typeof(EstablishAssociationSiemensProtocal)],
- inputStruct2);
- return outputStruct2 != null;
- });
+ (await (await
+ ForceSendReceiveAsync(this[typeof(CreateReferenceSiemensProtocal)], inputStruct)).SendReceiveAsync(
+ this[typeof(EstablishAssociationSiemensProtocal)], answer =>
+ new EstablishAssociationSiemensInputStruct(0x0101, _maxCalling,
+ _maxCalled,
+ _maxPdu))).Unwrap();
+ return outputStruct != null;
}
}
}
\ No newline at end of file
diff --git a/Modbus.Net/Modbus.Net/Modbus.Net.csproj b/Modbus.Net/Modbus.Net/Modbus.Net.csproj
index d0395eb..ecc2153 100644
--- a/Modbus.Net/Modbus.Net/Modbus.Net.csproj
+++ b/Modbus.Net/Modbus.Net/Modbus.Net.csproj
@@ -5,7 +5,7 @@
Modbus.Net
Modbus.Net
Modbus.Net
- 1.3.9
+ 1.4.0
Modbus.Net
Chris L.(Luo Sheng)
Hangzhou Delian IoT Science Technology Co.,Ltd.
@@ -52,6 +52,7 @@
+
diff --git a/Modbus.Net/src/Base.Common/BaseProtocal.cs b/Modbus.Net/src/Base.Common/BaseProtocal.cs
index 0f7acfb..1d58f15 100644
--- a/Modbus.Net/src/Base.Common/BaseProtocal.cs
+++ b/Modbus.Net/src/Base.Common/BaseProtocal.cs
@@ -9,7 +9,7 @@ namespace Modbus.Net
///
/// 基本协议
///
- public abstract class BaseProtocal : BaseProtocal
+ public abstract class BaseProtocal : BaseProtocal
{
///
/// 构造器
@@ -24,12 +24,32 @@ namespace Modbus.Net
///
/// 写入的内容,使用对象数组描述
/// 从设备获取的字节流
- public override async Task SendReceiveAsync(params object[] content)
+ public override async Task SendReceiveAsync(params object[] content)
{
- if (ProtocalLinker == null || !ProtocalLinker.IsConnected)
- await ConnectAsync();
- if (ProtocalLinker != null)
- return await ProtocalLinker.SendReceiveAsync(ProtocalUnit.TranslateContent(Endian, content));
+ if (content != null)
+ {
+ var pipeUnit =
+ new PipeUnit(
+ ProtocalLinker);
+ return await pipeUnit.SendReceiveAsync(Endian, paramOut => content);
+ }
+ return null;
+ }
+
+ ///
+ /// 发送协议,通过传入需要使用的协议内容和输入结构
+ ///
+ /// 协议的实例
+ /// 输入信息的结构化描述
+ /// 输出信息的结构化描述
+ public override async Task
+ SendReceiveAsync(ProtocalUnit unit, IInputStruct content)
+ {
+ if (content != null)
+ {
+ var pipeUnit = new PipeUnit(ProtocalLinker);
+ return await pipeUnit.SendReceiveAsync(unit, paramOut => content);
+ }
return null;
}
}
@@ -37,9 +57,11 @@ namespace Modbus.Net
///
/// 基本协议
///
- public abstract class BaseProtocal :
- IProtocal where TProtocalUnit : class, IProtocalFormatting
+ public abstract class BaseProtocal :
+ IProtocal
+ where TProtocalUnit : class, IProtocalFormatting
where TParamOut : class
+ where TPipeUnit : PipeUnit, TProtocalUnit>
{
///
/// 构造器
@@ -93,7 +115,8 @@ namespace Modbus.Net
{
//自动寻找存在的协议并将其加载
var protocalUnit =
- Activator.CreateInstance(type.GetTypeInfo().Assembly.GetType(protocalName)) as TProtocalUnit;
+ Activator.CreateInstance(type.GetTypeInfo().Assembly
+ .GetType(protocalName)) as TProtocalUnit;
if (protocalUnit == null)
throw new InvalidCastException($"No ProtocalUnit {nameof(TProtocalUnit)} implemented");
protocalUnit.Endian = Endian;
@@ -138,7 +161,8 @@ namespace Modbus.Net
/// 协议的实例
/// 输入信息的结构化描述
/// 输出信息的结构化描述
- public virtual IOutputStruct SendReceive(TProtocalUnit unit, IInputStruct content)
+ public virtual TPipeUnit SendReceive(
+ TProtocalUnit unit, IInputStruct content)
{
return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content));
}
@@ -149,9 +173,17 @@ namespace Modbus.Net
/// 协议的实例
/// 输入信息的结构化描述
/// 输出信息的结构化描述
- public virtual async Task SendReceiveAsync(TProtocalUnit unit, IInputStruct content)
+ public virtual async Task
+ SendReceiveAsync(TProtocalUnit unit, IInputStruct content)
{
- return await SendReceiveAsync(unit, content);
+ if (content != null)
+ {
+ var pipeUnit =
+ new PipeUnit, TProtocalUnit>(
+ ProtocalLinker);
+ return await pipeUnit.SendReceiveAsync(unit, paramOut => content) as TPipeUnit;
+ }
+ return null;
}
///
@@ -159,7 +191,7 @@ namespace Modbus.Net
///
/// 写入的内容,使用对象数组描述
/// 从设备获取的字节流
- public virtual TParamOut SendReceive(params object[] content)
+ public virtual TPipeUnit SendReceive(params object[] content)
{
return AsyncHelper.RunSync(() => SendReceiveAsync(content));
}
@@ -169,7 +201,7 @@ namespace Modbus.Net
///
/// 写入的内容,使用对象数组描述
/// 从设备获取的字节流
- public virtual Task SendReceiveAsync(params object[] content)
+ public virtual Task SendReceiveAsync(params object[] content)
{
throw new NotImplementedException();
}
@@ -196,20 +228,7 @@ namespace Modbus.Net
public virtual async Task SendReceiveAsync(TProtocalUnit unit, IInputStruct content)
where T : class, IOutputStruct
{
- var t = 0;
- var formatContent = unit.Format(content);
- if (formatContent != null)
- {
- TParamOut receiveContent;
- //如果为特别处理协议的话,跳过协议扩展收缩
- if (unit.GetType().GetTypeInfo().GetCustomAttributes(typeof(SpecialProtocalUnitAttribute)).Any())
- receiveContent = await ProtocalLinker.SendReceiveWithoutExtAndDecAsync(formatContent);
- else
- receiveContent = await ProtocalLinker.SendReceiveAsync(formatContent);
- if (receiveContent != null)
- return unit.Unformat(receiveContent, ref t);
- }
- return null;
+ return (await SendReceiveAsync(unit, content)).Unwrap();
}
///
diff --git a/Modbus.Net/src/Base.Common/BaseUtility.cs b/Modbus.Net/src/Base.Common/BaseUtility.cs
index f6a7797..5908772 100644
--- a/Modbus.Net/src/Base.Common/BaseUtility.cs
+++ b/Modbus.Net/src/Base.Common/BaseUtility.cs
@@ -30,7 +30,7 @@ namespace Modbus.Net
///
/// 基础Api入口
///
- public abstract class BaseUtility : BaseUtility
+ public abstract class BaseUtility : BaseUtility
{
///
/// 构造器
@@ -43,13 +43,14 @@ namespace Modbus.Net
///
/// 基础Api入口
///
- public abstract class BaseUtility : IUtilityProperty, IUtilityMethodData
+ public abstract class BaseUtility : IUtilityProperty, IUtilityMethodData
where TProtocalUnit : class, IProtocalFormatting where TParamOut : class
+ where TPipeUnit : PipeUnit, TProtocalUnit>
{
///
/// 协议收发主体
///
- protected IProtocal Wrapper;
+ protected IProtocal Wrapper;
///
/// 构造器
diff --git a/Modbus.Net/src/Base.Common/IProtocal.cs b/Modbus.Net/src/Base.Common/IProtocal.cs
index 0739ee7..37dedb8 100644
--- a/Modbus.Net/src/Base.Common/IProtocal.cs
+++ b/Modbus.Net/src/Base.Common/IProtocal.cs
@@ -9,8 +9,10 @@ namespace Modbus.Net
/// 向Connector传入的类型
/// 从Connector返回的类型
/// 协议单元的类型
- public interface IProtocal
- where TProtocalUnit : IProtocalFormatting
+ public interface IProtocal
+ where TProtocalUnit : class, IProtocalFormatting
+ where TParamOut : class
+ where TPipeUnit : PipeUnit, TProtocalUnit>
{
///
/// 协议的连接器
@@ -47,14 +49,14 @@ namespace Modbus.Net
///
/// 写入的内容,使用对象数组描述
/// 从设备获取的字节流
- TParamOut SendReceive(params object[] content);
+ TPipeUnit SendReceive(params object[] content);
///
/// 发送协议内容并接收,一般方法
///
/// 写入的内容,使用对象数组描述
/// 从设备获取的字节流
- Task SendReceiveAsync(params object[] content);
+ Task SendReceiveAsync(params object[] content);
///
/// 发送协议,通过传入需要使用的协议内容和输入结构
@@ -62,7 +64,7 @@ namespace Modbus.Net
/// 协议的实例
/// 输入信息的结构化描述
/// 输出信息的结构化描述
- IOutputStruct SendReceive(TProtocalUnit unit, IInputStruct content);
+ TPipeUnit SendReceive(TProtocalUnit unit, IInputStruct content);
///
/// 发送协议,通过传入需要使用的协议内容和输入结构
@@ -70,7 +72,7 @@ namespace Modbus.Net
/// 协议的实例
/// 输入信息的结构化描述
/// 输出信息的结构化描述
- Task SendReceiveAsync(TProtocalUnit unit, IInputStruct content);
+ Task SendReceiveAsync(TProtocalUnit unit, IInputStruct content);
///
/// 发送协议,通过传入需要使用的协议内容和输入结构
@@ -79,7 +81,8 @@ namespace Modbus.Net
/// 输入信息的结构化描述
/// 输出信息的结构化描述
/// IOutputStruct的具体类型
- T SendReceive(TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct;
+ T SendReceive(
+ TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct;
///
/// 发送协议,通过传入需要使用的协议内容和输入结构
@@ -88,6 +91,7 @@ namespace Modbus.Net
/// 输入信息的结构化描述
/// 输出信息的结构化描述
/// IOutputStruct的具体类型
- Task SendReceiveAsync(TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct;
+ Task SendReceiveAsync(
+ TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct;
}
}
\ No newline at end of file
diff --git a/Modbus.Net/src/Base.Common/PipeUnit.cs b/Modbus.Net/src/Base.Common/PipeUnit.cs
new file mode 100644
index 0000000..9a92b3d
--- /dev/null
+++ b/Modbus.Net/src/Base.Common/PipeUnit.cs
@@ -0,0 +1,116 @@
+using System;
+using System.Linq;
+using System.Reflection;
+using System.Threading.Tasks;
+
+namespace Modbus.Net
+{
+ public class PipeUnit : PipeUnit, ProtocalUnit>
+ {
+ public PipeUnit(IProtocalLinker protocalLinker) : base(protocalLinker)
+ {
+
+ }
+
+ protected PipeUnit(IProtocalLinker protocalLinker, ProtocalUnit protocalUnit, byte[] parameters,
+ bool success) : base(protocalLinker, protocalUnit, parameters, success)
+ {
+ }
+
+ public async Task SendReceiveAsync(Endian endian, Func inputStructCreator)
+ {
+ if (Success)
+ {
+ var content = inputStructCreator.Invoke(ReturnParams);
+ if (ProtocalLinker != null)
+ return new PipeUnit(ProtocalLinker, null,
+ await ProtocalLinker.SendReceiveAsync(ProtocalUnit.TranslateContent(endian, content)),
+ true);
+ }
+ return new PipeUnit(ProtocalLinker, null, ReturnParams, false);
+ }
+
+ public async Task SendReceiveAsync(
+ ProtocalUnit unit,
+ Func inputStructCreator)
+ {
+ var receiveContent = await SendReceiveAsync1(unit, inputStructCreator);
+ if (receiveContent != null)
+ return new PipeUnit(ProtocalLinker, unit,
+ receiveContent, true);
+ return new PipeUnit(ProtocalLinker, unit, ReturnParams,
+ false);
+ }
+
+ public byte[] Unwrap()
+ {
+ return ReturnParams;
+ }
+ }
+
+ public class PipeUnit
+ where TProtocalUnit : class, IProtocalFormatting
+ where TProtocalLinker : class, IProtocalLinker
+ where TParamOut : class
+ {
+ public PipeUnit(TProtocalLinker protocalLinker) : this(protocalLinker, null, null, true)
+ {
+
+ }
+
+ protected PipeUnit(TProtocalLinker protocalLinker, TProtocalUnit protocalUnit, TParamOut parameters, bool success)
+ {
+ ProtocalLinker = protocalLinker;
+ ProtocalUnit = protocalUnit;
+ ReturnParams = parameters;
+ Success = success;
+ }
+
+ protected TProtocalLinker ProtocalLinker { get; set; }
+
+ protected TProtocalUnit ProtocalUnit { get; set; }
+
+ protected TParamOut ReturnParams { get; set; }
+
+ public bool Success { get; }
+
+ protected async Task SendReceiveAsync1(TProtocalUnit unit,
+ Func inputStructCreator)
+ {
+ if (Success)
+ {
+ var content = inputStructCreator.Invoke(ReturnParams);
+ var formatContent = unit.Format(content);
+ if (formatContent != null)
+ {
+ TParamOut receiveContent;
+ //如果为特别处理协议的话,跳过协议扩展收缩
+ if (unit.GetType().GetTypeInfo().GetCustomAttributes(typeof(SpecialProtocalUnitAttribute)).Any())
+ receiveContent = await ProtocalLinker.SendReceiveWithoutExtAndDecAsync(formatContent);
+ else
+ receiveContent = await ProtocalLinker.SendReceiveAsync(formatContent);
+ return receiveContent;
+ }
+ }
+ return null;
+ }
+
+ public virtual async Task> SendReceiveAsync(
+ TProtocalUnit unit,
+ Func inputStructCreator)
+ {
+ var receiveContent = await SendReceiveAsync1(unit, inputStructCreator);
+ if (receiveContent != null)
+ return new PipeUnit(ProtocalLinker, unit,
+ receiveContent, true);
+ return new PipeUnit(ProtocalLinker, unit, ReturnParams,
+ false);
+ }
+
+ public T Unwrap() where T : class, IOutputStruct
+ {
+ var t = 0;
+ return ProtocalUnit.Unformat(ReturnParams, ref t);
+ }
+ }
+}
\ No newline at end of file