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

VS2015构建后配置WPF程序至不同目录并实现正常调用

问题描述

我有一个包含3个项目的解决方案:2个WPF应用程序(WPF_A和WPF_B)以及1个类库。工作目录结构如下:

PARAM(包含.sln文件)
├── PROJECT A(包含WPF_A和WPF_B)
└── CC(包含类库)

WPF_A通过以下代码调用WPF_B:

private void button_Click(object sender, RoutedEventArgs e)
{
    var newform = new WPF_B.MainWindow();
    newform.Show();
}

在Visual Studio 2015中运行WPF_A时该调用正常生效,但Release构建后希望实现以下目录结构:

WPF_A
├── CC
│   └── Library.dll
└── PROJECT_B
    └── WPF_B.exe

目前已能构建出该目录结构,但WPF_A无法调用不在同一目录下的WPF_B,请问如何配置项目以实现目标目录结构并保证调用正常?

解决方案

1. 配置项目输出路径

先调整WPF_B和类库的输出路径,确保构建后文件自动进入目标目录:

  • 右键WPF_B项目 → 属性 → 生成 → 输出路径,设置为$(SolutionDir)WPF_A\PROJECT_B\WPF_B\(根据实际SolutionDir路径微调,确保最终输出到目标子目录)
  • 右键类库项目 → 属性 → 生成 → 输出路径,设置为$(SolutionDir)WPF_A\CC\

2. 添加程序集探测路径(App.config配置)

CLR默认只会在WPF_A的执行目录和系统目录查找依赖程序集,需要在WPF_A的App.config中添加探测规则:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="PROJECT_B\WPF_B;CC" />
    </assemblyBinding>
  </runtime>
</configuration>

privatePath中的路径是相对于WPF_A执行目录的子目录,多个路径用分号分隔。

3. 调整项目引用属性

在WPF_A对WPF_B的引用中,右键引用 → 属性:

  • 将复制本地设置为False(避免WPF_B被自动复制到WPF_A根目录,破坏目标结构)
  • 确认路径指向WPF_B项目的输出目录(即目标子目录)

4. 备选方案:动态加载程序集

如果上述配置仍无法解决问题,可以手动加载WPF_B程序集并创建实例:

private void button_Click(object sender, RoutedEventArgs e)
{
    // 拼接WPF_B程序集的完整路径
    var assemblyPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "PROJECT_B\\WPF_B\\WPF_B.exe");
    var assembly = System.Reflection.Assembly.LoadFrom(assemblyPath);
    
    // 反射创建MainWindow实例并显示
    var windowType = assembly.GetType("WPF_B.MainWindow");
    var newform = (System.Windows.Window)Activator.CreateInstance(windowType);
    newform.Show();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:37:07