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); } } }