You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

控制台应用如何获取AppDomain.CurrentDomain.ActivationContext对象

报错原因

AppDomain.CurrentDomain.ActivationContext 是ClickOnce部署架构专属的上下文对象,仅当应用通过ClickOnce发布、并通过ClickOnce激活入口启动时,运行时才会初始化该属性并赋值。普通本地编译直接运行、未配置ClickOnce发布的控制台应用,该属性默认值为null,直接访问ac.Identity必然触发空引用异常。

解决方案

根据实际使用场景选择对应处理方式:

  • 场景1:需要对接ClickOnce部署能力
    1. 右键控制台项目,打开「属性-发布」页,按照向导完成ClickOnce发布配置,生成发布安装包
    2. 不要直接在编译输出目录双击exe启动程序,要通过ClickOnce入口启动:比如点击发布生成的.application清单文件、或者完成ClickOnce安装后从开始菜单快捷方式启动,此时ActivationContext会被正常初始化
    3. 代码中必须增加空值防御逻辑,避免非ClickOnce启动场景崩溃
  • 场景2:仅需要获取当前应用的基础信息(程序集标识、运行路径等)
    不要使用ActivationContext相关API,改用通用运行时接口即可,该对象在非ClickOnce场景没有任何实用价值。
修复后可直接运行的代码
using System;
using System.Reflection;

namespace ActivationContextSample
{
    public class Program : MarshalByRefObject
    {
        public static void Main(string[] args)
        {
            ActivationContext ac = AppDomain.CurrentDomain.ActivationContext;
            if (ac != null)
            {
                // 仅ClickOnce激活场景下可正常访问
                ApplicationIdentity ai = ac.Identity;
                Console.WriteLine("ClickOnce应用标识 = " + ai.FullName);
                Console.WriteLine("ClickOnce代码基址 = " + ai.CodeBase);
            }
            else
            {
                // 通用场景下获取应用信息
                Assembly entryAssembly = Assembly.GetEntryAssembly();
                Console.WriteLine("入口程序集标识 = " + entryAssembly.FullName);
                Console.WriteLine("应用运行根目录 = " + AppContext.BaseDirectory);
            }
            Console.Read();
        }

        public void Run()
        {
            Main(Array.Empty<string>());
            Console.ReadLine();
        }
    }
}
注意事项
  • ActivationContext没有公开的构造函数,无法在非ClickOnce场景下手动创建有效实例,强行通过反射构造的实例不具备实际运行时上下文,没有使用价值
  • 任何场景下访问该属性都要先做空值判断,兼容不同启动方式

内容的提问来源于stack exchange,提问作者Ravindra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:27:14