尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

DotNetIsolator是什么?在.NET中运行隔离.NET运行时的完整入门指南

DotNetIsolator是什么?在.NET中运行隔离.NET运行时的完整入门指南 DotNetIsolator是什么在.NET中运行隔离.NET运行时的完整入门指南【免费下载链接】DotNetIsolatorA library for running isolated .NET runtimes inside .NET项目地址: https://gitcode.com/gh_mirrors/do/DotNetIsolatorDotNetIsolator 是一个让你在 .NET 应用中轻松运行隔离 .NET 运行时的开源库它可以在你自己的 .NET 进程内启动多个彼此完全隔离的 .NET 运行时沙箱并在其中执行任意代码、创建对象、调用方法还能跨边界传递任意类型的数据。本文是一份面向新手的DotNetIsolator 入门指南用最简单的语言讲清它的核心原理、最快上手步骤和常用 API帮你快速掌握这个“在 .NET 里跑另一个 .NET”的隔离方案。DotNetIsolator 的核心原理为什么能在 .NET 里再跑一个 .NETDotNetIsolator 的实现思路非常巧妙它把每个隔离运行时构建成一个WebAssembly 沙箱而不是简单地开一个线程或进程。具体来说项目基于以下两个关键组件dotnet-wasi-sdk把 .NET 运行时基于 Mono 的 WebAssembly 版本编译成 Wasm 模块Wasmtime一个高性能的 WebAssembly 运行时负责在宿主 .NET 进程中加载和执行这些模块。你可以像创建普通对象一样创建任意多个IsolatedRuntime实例每一个都拥有完全独立的内存空间与宿主互不共享无法直接访问宿主机器的磁盘、网络和操作系统 API独立的程序集加载机制只有被授权加载的 DLL 才能进入沙箱。这也是它名字的由来DotNetIsolator .NET Isolator隔离器。核心类型定义可以在 src/DotNetIsolator/ 目录下找到例如 IsolatedRuntime.cs 和 IsolatedRuntimeHost.cs。快速上手三步完成第一次隔离调用下面用一个最简单的例子带你完成第一次 DotNetIsolator 调用。整个示例代码可以在项目的sample/ConsoleSample/目录中找到参考 Program.cs。第一步安装 DotNetIsolator 包在任意 .NET 项目中执行dotnet add package DotNetIsolator --prerelease⚠️ 注意该库目前是实验性预发布版本需要加--prerelease参数。也可以直接克隆仓库体验示例git clone https://gitcode.com/gh_mirrors/do/DotNetIsolator第二步创建宿主与隔离运行时DotNetIsolator 的使用分为两层先创建全局复用的IsolatedRuntimeHost再基于它创建轻量的IsolatedRuntimeusing var host new IsolatedRuntimeHost().WithBinDirectoryAssemblyLoader(); using var runtime new IsolatedRuntime(host);这里有一个关键点宿主对象应该全局复用。因为启动 Wasmtime 引擎大约需要 400ms而创建单个隔离运行时只要约 8ms所以要把耗时的一次性工作放在IsolatedRuntimeHost里完成后续再创建多少个隔离运行时都很便宜。第三步调用 Lambda 并观察结果现在你就可以把代码“扔进”隔离运行时里执行了using System.Runtime.InteropServices; // 这行在宿主进程里执行 Console.WriteLine($Im running on {RuntimeInformation.OSArchitecture}); // 这行在隔离的 WebAssembly 沙箱里执行 runtime.Invoke(() { Console.WriteLine($Im running on {RuntimeInformation.OSArchitecture}); });运行后你会看到两行不同的输出——宿主侧显示的是你的 CPU 架构如 X64而隔离侧显示的是Wasm。 这就是“两个 .NET 运行时同时工作”的直观证据。跨边界传值任意类型数据自动序列化DotNetIsolator 最方便的一点是跨边界传递数据时你完全不用手写任何序列化代码。库内部通过 MessagePack 自动完成序列化与反序列化。这意味着你可以在 Lambda 中捕获宿主侧的变量隔离运行时里直接使用把任意自定义类型record、class、Dictionary等作为参数传入或作为返回值传出返回任意复杂类型的对象宿主侧按类型图安全反序列化。例如在 README 的示例中宿主和隔离运行时分别统计环境变量数量隔离侧得到的是 0 条因为沙箱里根本没有宿主的环境变量——数据边界非常清晰。进阶玩法在隔离运行时中创建对象并调用方法除了调用 LambdaDotNetIsolator 还支持在隔离运行时内部实例化对象然后远程调用其方法类似“跨进程的反射调用”。创建隔离对象// 泛型 API IsolatedObject obj runtime.CreateObjectPerson(); // 字符串 API宿主程序不引用该程序集时很有用 IsolatedObject obj2 runtime.CreateObject(MyAssembly, MyNamespace, Person);目前要求目标类型必须有无参构造函数构造参数支持还在 TODO 列表中见 NOTES.md。调用对象方法// 调用无返回值方法 obj.InvokeVoid(DoSomething, 123); // 调用有返回值的方法需指定返回类型 TimeSpan result obj.Invokebool, TimeSpan(GetAge, true);也可以先拿到方法引用、稍后再调用类似于MethodInfo的用法var method runtime.GetMethod(typeof(Person), GetAge); var age method.Invokebool, TimeSpan(obj, true);这些 API 的完整实现与测试用例分别位于 IsolatedObject.cs、IsolatedMethod.cs以及test/DotNetIsolator.Test/下的测试项目中如 MethodInvocationTest.cs。双向通信隔离代码如何反向调用宿主隔离沙箱并不是“与世隔绝”的——宿主可以注册命名回调让隔离侧的代码反过来调用宿主的功能。这就是“Guest 调用 Host”机制代码在 DotNetIsolator.Guest/DotNetIsolatorHost.cs 中实现。宿主侧注册回调runtime.RegisterCallback(addTwoNumbers, (int a, int b) a b); runtime.RegisterCallback(getHostTime, () DateTime.Now);隔离侧需引用DotNetIsolator.Guest包调用var sum DotNetIsolatorHost.Invokeint(addTwoNumbers, 123, 456); var hostTime DotNetIsolatorHost.InvokeDateTime(getHostTime);整个过程同样是 MessagePack 自动序列化双向都支持复杂类型参考测试 HostCallbackTest.cs。在 AOT 场景下还可以使用InvokeRaw直接传递原始byte[]绕过类型反序列化限制。安全边界WebAssembly 沙箱的隔离能力与注意事项关于隔离的安全性官方在 README 中有非常坦诚的说明这里总结为 3 点✅WebAssembly 本身是久经考验的沙箱浏览器运行来自任意网站的不可信 Wasm 模块已有多年安全记录良好⚠️Wasmtime 与浏览器实现不同项目使用的 Wasmtime 是另一套实现尚未经过专门的安全审查⚠️侧信道攻击未覆盖WebAssembly 安全模型不直接防御 Spectre 这类侧信道攻击。因此作者的建议是如果只是隔离管理自己的代码比如插件系统、多租户逻辑隔离DotNetIsolator 非常合适如果要把完全不可信的第三方代码作为唯一安全边界则需要谨慎评估最好作为多层安全体系中的一层。项目现状与适用场景最后说说项目定位DotNetIsolator 目前是EXPERIMENTAL实验性项目官方明确标注“unsupported”不承诺后续持续开发功能上也存在明显缺口如构造参数、异步调用、内存/CPU 上限配置等尚不支持详见 NOTES.md。它适合这样的场景插件系统执行第三方插件代码而不污染主进程代码沙箱实验安全地运行不可信或不可靠的代码片段️多租户/多环境模拟在同一个进程中模拟多个互相隔离的 .NET 环境学习 WebAssembly .NET研究 Mono 如何在 Wasm 上运行。总结DotNetIsolator 用 WebAssembly 沙箱实现了“在 .NET 里跑隔离的 .NET 运行时”这个听起来很神奇的能力而且上手成本极低一个IsolatedRuntimeHost、一个IsolatedRuntime、一行Invoke就能把代码安全地扔进沙箱执行。虽然它目前还是实验性项目但作为隔离执行和插件沙箱的探索方向非常值得一试。如果这篇 DotNetIsolator 入门指南对你有帮助不妨亲自跑一遍示例代码感受“两个 .NET 运行时”同时工作的奇妙体验吧【免费下载链接】DotNetIsolatorA library for running isolated .NET runtimes inside .NET项目地址: https://gitcode.com/gh_mirrors/do/DotNetIsolator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表