DotNetIsolator对象操作全攻略:创建IsolatedObject并调用方法的完整教程

发布时间:2026/8/18 16:13:23
DotNetIsolator对象操作全攻略:创建IsolatedObject并调用方法的完整教程 DotNetIsolator对象操作全攻略创建IsolatedObject并调用方法的完整教程【免费下载链接】DotNetIsolatorA library for running isolated .NET runtimes inside .NET项目地址: https://gitcode.com/gh_mirrors/do/DotNetIsolatorDotNetIsolator 是一个让你在 .NET 程序中轻松运行隔离的 .NET 运行时的开源库其核心能力就是对象操作在沙箱中创建 IsolatedObject、跨边界调用方法并自动序列化参数与返回值。本教程面向新手用最少的代码带你掌握 IsolatedObject 的创建与调用方法技巧全程无需理解 WebAssembly 底层细节。 提示本项目处于实验阶段官方不提供技术支持承诺。作为学习探索隔离 .NET 运行时技术非常合适但不建议直接用于生产环境的关键安全边界。一、DotNetIsolator 是什么为什么需要隔离运行代码简单说DotNetIsolator 能让你在宿主 .NET 进程内启动多个互相隔离的 .NET 运行时。每个运行时其实是一个基于 WebAssembly 的沙箱由 dotnet-wasi-sdk 构建、Wasmtime 执行拥有完全独立的内存空间无法直接访问宿主机的磁盘、网络和操作系统。它的两大核心操作是调用 Lambda把一段方法扔进隔离运行时执行对象操作在隔离运行时内创建 IsolatedObject再调用它的方法本文重点讲解第二种也就是创建 IsolatedObject 并调用方法的完整流程。核心代码都在这几个文件里src/DotNetIsolator/IsolatedObject.cs—— IsolatedObject 的调用 APIsrc/DotNetIsolator/IsolatedRuntime.cs—— 隔离运行时与对象创建入口src/DotNetIsolator/IsolatedMethod.cs—— 方法引用与调用sample/ConsoleSample.GuestCode/MyClass.cs—— 官方示例的客端类二、环境准备一分钟搭建 DotNetIsolator 开发环境在开始对象操作之前先安装 NuGet 包dotnet add package DotNetIsolator --prerelease然后在项目中引入命名空间using DotNetIsolator;就是这么简单接下来就可以开始创建隔离对象了。三、创建 IsolatedRuntime 的基础搭建步骤创建 IsolatedObject 之前需要先搭好两层基础结构IsolatedRuntimeHost负责启动 Wasmtime 引擎约耗时 400ms建议复用可注册为单例IsolatedRuntime每个隔离运行时实例创建约耗时 8ms可按需创建多个推荐用WithBinDirectoryAssemblyLoader让隔离运行时能加载你宿主程序的程序集这是创建自定义类型对象的前提using var host new IsolatedRuntimeHost() .WithBinDirectoryAssemblyLoader(); // 允许加载 bin 目录下的程序集 using var runtime new IsolatedRuntime(host); // 创建隔离运行时四、创建 IsolatedObject 的两种实用方法创建对象是 DotNetIsolator 对象操作的第一步官方提供了两种 API按需选择方法一泛型 API推荐类型安全IsolatedObject obj1 runtime.CreateObjectPerson();方法二字符串 API宿主未引用该程序集时当宿主程序没有直接引用目标类型所在程序集时可以用字符串指定程序集、命名空间和类名IsolatedObject obj2 runtime.CreateObject(MyAssembly, MyNamespace, Person);⚠️ 注意CreateObject要求类型拥有无参构造函数带参数的构造函数暂不支持未来可能实现。如果想直接把宿主侧的对象复制进隔离运行时值传递还可以使用CopyObject它通过 MessagePack 自动序列化IsolatedObject obj runtime.CopyObject(new Person { Age 18 });五、调用 IsolatedObject 方法的完整指南对象创建好之后就可以调用它的方法了。核心思路是有返回值用Invoke无返回值用InvokeVoid参数和返回值通过泛型参数声明。1. 调用无返回值方法InvokeVoid比如对象有一个void DoSomething(int value)方法isolatedObject.InvokeVoid(DoSomething, 123);2. 调用有返回值方法Invoke比如有一个TimeSpan GetAge(bool includeGestation)方法需要把返回类型写在泛型参数中参数类型依次排在前TimeSpan result isolatedObject.Invokebool, TimeSpan(GetAge, true);这里的泛型顺序是参数类型..., 返回类型0 到 5 个参数都有对应重载。3. 多参数方法调用技巧多个参数按顺序传入即可例如方法string Describe(int a, bool b, string c)string desc isolatedObject.Invokeint, bool, string, string(Describe, 123, true, Hello);4. 异常处理跨边界异常会抛到宿主侧如果隔离运行时内的方法抛出了异常宿主侧会收到IsolatedException其中包含客端的堆栈信息try { isolatedObject.InvokeVoid(ThrowException); } catch (IsolatedException ex) { Console.WriteLine(ex.ToString()); // 包含客端异常类型与堆栈 }六、IsolatedMethod先查找方法再调用的高级玩法如果不想每次调用都写方法名字符串可以先把方法抓成IsolatedMethod引用类似MethodInfo之后随时调用// 从对象上查找方法 var getAgeMethod isolatedObject.FindMethod(GetAge); // 稍后调用注意要传入目标对象 var age getAgeMethod.Invokebool, TimeSpan(isolatedObject, true);甚至不用创建对象直接从运行时按类型查找var getAgeMethod runtime.GetMethod(typeof(Person), GetAge);IsolatedMethod的好处是可以重复调用、延迟调用适合在循环或事件回调场景中复用。七、对象资源释放与常见避坑指南释放对象引用隔离对象持有客端的 GCHandle用完后建议调用ReleaseGCHandle()释放isolatedObject.ReleaseGCHandle();当然IsolatedObject的析构函数也会兜底释放但显式释放更及时。四个新手常见坑忘记配置程序集加载器不配置WithBinDirectoryAssemblyLoader时创建自定义类型会直接抛出IsolatedException找不到程序集类型找不到检查命名空间和类名拼写CreateObject的字符串参数必须完全匹配构造参数不支持确保目标类型有无参构造函数内存不共享在隔离运行时内修改对象的字段不会影响宿主侧的原对象两边是序列化复制的关系八、总结DotNetIsolator 对象操作三步法回顾整个教程创建 IsolatedObject 并调用方法只需要记住三步搭环境IsolatedRuntimeHostWithBinDirectoryAssemblyLoaderIsolatedRuntime建对象CreateObjectT()或CreateObject(程序集, 命名空间, 类名)调方法Invoke参数, 返回(方法名, ...)或InvokeVoid(方法名, ...)掌握这三步你就能在隔离沙箱中自由操作任意自定义对象了。更进一步你还可以用RegisterCallback让隔离代码反向调用宿主方法详见src/DotNetIsolator/IsolatedRuntime.cs和src/DotNetIsolator.Guest/DotNetIsolatorHost.cs实现完整的双向通信。想动手实践克隆仓库后可以直接参考sample/ConsoleSample/下的官方示例以及test/DotNetIsolator.Test/MethodInvocationTest.cs中覆盖各种参数组合的测试用例照着跑一遍很快就能上手git clone https://gitcode.com/gh_mirrors/do/DotNetIsolator【免费下载链接】DotNetIsolatorA library for running isolated .NET runtimes inside .NET项目地址: https://gitcode.com/gh_mirrors/do/DotNetIsolator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考