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

如何在CS-Script中定位WPF XAML文件以显示对话框组件?

解决CS-Script中WPF对话框无法定位XAML资源的问题

一、修复资源定位的几种方法

CS-Script的动态执行环境和常规编译程序集的资源加载逻辑不一样,原来的相对URI没法正确找到嵌入的BAML,试试下面的方案:

1. 改用绝对Pack URI

把原来的相对URI换成WPF标准的绝对资源格式,明确指定程序集和资源位置:

System.Uri resourceLocater = new System.Uri("pack://application:,,,/CLTD;component/view/summarydialog.xaml", System.UriKind.Absolute);

pack://application:,,, 会告诉WPF从当前应用域的目标程序集里找资源,能精准定位到CLTD.dll里的BAML。

2. 手动读取BAML资源流

既然已经通过dotPeek看到BAML在CLTD.g.resources/View/summarydialog.baml,可以直接从程序集里读资源流加载:

var assembly = typeof(SummaryDialog).Assembly;
using (var stream = assembly.GetManifestResourceStream("CLTD.g.resources.View.summarydialog.baml"))
{
    var reader = new System.Windows.Baml2006.Baml2006Reader(stream);
    var dialog = System.Windows.Markup.XamlReader.Load(reader) as SummaryDialog;
    dialog.ShowDialog();
}

注意资源名称要完全匹配,路径里的斜杠要换成点号,因为嵌入资源的命名是用点分隔的格式,而且区分大小写。

3. 明确引用目标程序集

在CS-Script开头用//css_ref指令指定要加载的CLTD.dll,确保脚本能正确关联到包含资源的程序集:

//css_ref CLTD.dll;

同时要保证CLTD.dll和脚本文件在同一目录,或者在CS-Script的搜索路径范围内。

二、为什么可执行文件能正常运行?

EXE和CS-Script的执行环境有核心差异:

  • EXE是独立的应用程序,WPF资源系统默认把EXE作为主程序集,相对URI会以你的程序集为基准查找资源,自然能找到嵌入的BAML。
  • CS-Script是动态编译执行脚本,它的主程序集是CS-Script的宿主(比如cscs.exe),不是你的CLTD.dll。原来的相对URI会基于宿主程序集找资源,当然找不到CLTD里的内容。
    说白了就是两者的资源查找“基准程序集”不一样,哪怕用同一个DLL,结果也不同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:02:20