我的应用是独立发布的,在用户的设备上不需要额外去安装 .NET 运行时。但是我的应用有一个需求是下载另一个应用作为插件,由本应用调起插件进程。本文告诉大家如何解决调用插件的进程时,赋值给插件进程运行时的文件夹路径,解决环境依赖

我遇到的问题是,如何让调起的插件的进程共用我所在的应用的运行时,而不需要下载插件的时候,另外下载运行时文件

如果插件和我的应用在相同的文件夹下,那自然没有问题,插件默认就能使用我应用的运行时文件。但我的应用默认是被安装到 Program File 文件夹下的,如果下载的插件也放入到此文件夹下,那就需要管理员权限了

而如果我将插件放入到 AppData 文件夹下,那自然不需要管理员权限,但是插件运行就找不到运行时文件夹了。如果将运行时所需要的文件也拷贝过去,那就会被用户吐槽我占用了太多 C 盘空间了

一个好的解决方法是通过环境变量的方式,在 dotnet 6 里面,可以通过 DOTNET_ROOT 环境变量,或者 x86 的 DOTNET_ROOT(x86) 环境变量,让应用执行起来时,了解去哪里获取运行时依赖

解决方法是在当前应用进程里设置环境变量,如此通过 Windows 的环境变量机制,由当前应用启动的进程都默认会继承当前应用的环境变量的机制,可以让被当前应用启动的插件进程拿到环境变量,从而了解需要从哪个文件夹加载运行时

        /// <summary>
/// 加上环境变量,让调用的启动进程也自动能找到运行时
/// </summary>
static void AddEnvironmentVariable()
{
string key;
if (Environment.Is64BitOperatingSystem)
{
// https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-environment-variables
key = "DOTNET_ROOT(x86)";
}
else
{
key = "DOTNET_ROOT";
} var runtimeFolder = "xxx 绝对路径,例如当前应用所在的文件夹";
Environment.SetEnvironmentVariable(key, runtimeFolder);
}

给自己的应用执行如上代码,即可给当前进程加上环境变量,从而让当前进程启动的其他进程也拿到相同的变量

以上代码是给 x86 应用设置的,如果自己的应用和插件应用同时都是 x64 的,那么只需要使用 DOTNET_ROOT 即可

另外,以上有一个坑就是对 x86 和 x64 混合应用不友好,如果有混合使用的,记得需要做额外的拆分逻辑,让对应的应用加载到符合预期的运行时

更多请看

.NET environment variables - .NET CLI

dotnet 6 通过 DOTNET_ROOT 让调起的应用的进程拿到共享的运行时文件夹的更多相关文章

  1. 《DotNet Web应用单文件部署系列》二、打包wwwroot文件夹

    在这篇文章中,你将学到web缓存规则,文件传输中用到的压缩格式,以及如何手写代码响应请求.最后还能学到快速打包wwwroot文件夹组件用法. 一.了解Response Header 当第一次加载程序时 ...

  2. brew 安装的.net 运行时提示"Did you mean to run dotnet SDK commands?"

    原因未知,但有解决方案 使用 brew cask 安装的.NET Core brew cask install dotnet 结果运行时出现: 解决方案: 下载官方 .pkg 文件安装,顺便卸载掉 b ...

  3. 《Linux性能及调优指南》 Linux进程管理

    版权所有: 原文名称:<Linux Performance and Tuning Guidelines> 原文地址:http://www.redbooks.ibm.com/abstract ...

  4. [JVM教程与调优] 什么是JVM运行时参数?

    我们接着上一章节[JVM教程与调优] JVM都有哪些参数类型?的内容继续讲解,这章我们来介绍一下:如何查看JVM运行时参数.这一点十分重要,因为我们在进行JVM参数调优的时候,我们首先得知道目前系统运 ...

  5. JVM性能调优(1) —— JVM内存模型和类加载运行机制

    一.JVM内存模型 运行一个 Java 应用程序,必须要先安装 JDK 或者 JRE 包.因为 Java 应用在编译后会变成字节码,通过字节码运行在 JVM 中,而 JVM 是 JRE 的核心组成部分 ...

  6. <JVM下篇:性能监控与调优篇>04-JVM运行时参数

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  7. PublishFolderCleaner 让你的 dotnet 应用发布文件夹更加整洁

    大家都知道,在 dotnet 发布时,将会在输出的 publish 文件夹包含所需的依赖.在 .NET Core 开始,引入了 AppHost 的概念,即使是单个程序集,也需要独立的 Exe 可执行文 ...

  8. dotnet 6 使用 CreateSymbolicLink 创建文件夹符号链接

    本文告诉大家如何使用 dotnet 6 提供的 Directory.CreateSymbolicLink 和 File.CreateSymbolicLink 方法创建文件夹和文件的符号链接 Direc ...

  9. 菜鸟调错(五)——jetty运行时无法保存文件

    背景交代: 上一篇博客写的是用jetty和Maven做开发.测试.在使用的过程中遇到一个小问题,就是在jetty启动以后,修改了jsp.xml等文件无法保存. 错误信息: 解决方案: 到Maven库( ...

  10. 记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策

    在经过了两年的准备,以及迁移了几个应用项目积累了让我有信心的经验之后,我最近在开始将团队里面最大的一个项目,从 .NET Framework 4.5 迁移到 .NET 6 上.这是一个从 2016 时 ...

随机推荐

  1. View事件机制源码分析

    目录介绍 01.Android中事件分发顺序 02.Activity的事件分发机制 2.1 源码分析 2.2 点击事件调用顺序 2.3 得出结论 03.ViewGroup事件的分发机制 3.1 看一下 ...

  2. flutter版本的玩Android客户端

    flutter学习案例 目录介绍 00.项目下载与查看 01.项目介绍 02.项目优势 03.部分功能介绍 04.部分截图展示 05.版本更新 06.flutter系列博客 07.感谢 08.如何辨别 ...

  3. npm create vue@latest 执行过程

    1. 引言 目前(2024年3月13日),打开Vue的官网,可以发现其推荐新建一个Vue项目的命令是npm create vue@latest,为啥这句命令就可以创建一个Vue项目呢 2. 执行过程 ...

  4. WPF命令绑定

    在WPF中有时候不想将命令写在List中,但是却要在前端绑定的List中写入命令 暂时知道两种解决方法 1. Command="{Binding DataContext.NavicateCo ...

  5. 使用systemd部署r-nacos

    1. 前言 r-nacos是一个用rust实现的nacos服务.相较于java nacos来说,是一个提供相同功能,启动更快.占用系统资源更小(初始内存小于10M).性能更高.运行更稳定的服务. r- ...

  6. Python - inspect 模块的简单使用

    Python中的inspect模块解析 Python的inspect模块是一个强大的内省工具,允许开发者检查(inspect)活动对象和源代码.它提供了一系列函数,用于获取信息关于正在运行的程序和调用 ...

  7. Kubernetes(K8S)命令指南

    本文提供了一份全面的Kubernetes(K8S)命令指南,旨在帮助用户掌握和运用K8S的各种命令. 关注[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有10+年互联网 ...

  8. Elasticjob 3.x 最新版本源码解读(含备注源码)

    源码地址(含备注):https://gitee.com/ityml/elastic-job-zgc 官方网站: https://shardingsphere.apache.org/elasticjob ...

  9. k8s之operator

    背景 数字经济的兴起推动了云计算.物联网.大数据行业的快速蓬勃发展,对数据中心提出了更高的要求,同时,用户对于数据库运维自动化的需求越来越高,数据库即服务的需求越来越强烈. 随着k8s的普及以及云原生 ...

  10. HTML基础之input系列

    <form action=""> <div> 用户名:<input type="text" name="user&quo ...