namespace DeviceService.Driver
{
///
/// 由 DriverManager 创建并统一管理的驱动实例代理。
///
/// 驱动对象本身活在驱动包的 AppDomain 中(WPF/普通类均不可跨域封送),
/// 因此宿主拿到的是本类的透明代理:宿主调用 、
/// 、 时,实际执行都发生在驱动自己的域内。
///
public sealed class DriverInstance : MarshalByRefObject
{
private readonly DriverLoader _owner;
/// 实例句柄(宿主与加载器之间定位实例的唯一标识)
public string Handle { get; }
/// 驱动类型的 CLR 全名
public string TypeFullName { get; }
/// 注解中的"类型"(如 CAN)
public string DriverType { get; }
/// 注解中的"品牌"(如 BA)
public string Brand { get; }
/// 所属驱动包名(由 DriverManager 回填,仅用于展示)
public string PackageFolder { get; set; }
// 实例由 DriverManager 长期持有,无限生存期,避免远程租约到期被回收
public override object InitializeLifetimeService() => null;
internal DriverInstance(DriverLoader owner, string handle, string typeFullName,
string driverType, string brand)
{
_owner = owner;
Handle = handle;
TypeFullName = typeFullName;
DriverType = driverType;
Brand = brand;
}
/// 列出该驱动类型可调用的公共方法(用于确定 methodIndex)
public DriverMethodInfo[] GetMethods()
{
return _owner.GetMethods(TypeFullName);
}
///
/// 在该驱动实例上反射调用方法。参数为字符串形式,按目标类型自动转换,
/// out/ref 参数的回填值会包含在结果中。
///
public InvokeResult Invoke(int methodIndex, string[] rawArgs)
{
return _owner.InvokeOnInstance(Handle, methodIndex, rawArgs);
}
///
/// 直接调用(原始对象参数/返回值),供动态代理使用。
/// 注意:参数与返回值必须可跨域封送(基元类型、string、[Serializable] DTO)。
///
public InvokeDirectResult InvokeDirect(int methodIndex, object[] args)
{
return _owner.InvokeOnInstanceDirect(Handle, methodIndex, args);
}
///
/// 释放该实例(若驱动实现了 IDisposable 则调用 Dispose)。
///
public void Release()
{
_owner.ReleaseInstance(Handle);
}
}
}