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

Nuget类库包含的.exe文件引入主项目后未出现在输出目录求助

问题根因

你当前的配置存在两个核心问题:

  1. Nuget默认仅会处理contentFiles目录下的内容文件,自动复制到引用项目的输出目录,你将exe放在lib目录下,不属于Nuget约定的自动复制内容范围
  2. AppDomain.CurrentDomain.BaseDirectory返回的是主进程的根目录,本身就不会指向Nuget缓存路径,你之前获取类库路径失败大概率是代码使用方式不正确

方案1:自动将Drivers目录复制到主项目输出目录(推荐)

第一步:修改类库.csproj配置

替换你原来的Content节点为以下配置:

<ItemGroup>
  <Content Include="Drivers/**" Pack="true">
    <!-- 同时打包到contentFiles和lib目录,兼容两种调用场景 -->
    <PackagePath>contentFiles/any/any/Drivers;lib/net5.0/Drivers</PackagePath>
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    <CopyToPublishDirectory>Always</CopyToPublishDirectory>
    <!-- 强制引用项目自动复制该内容到输出目录 -->
    <PackageCopyToOutput>true</PackageCopyToOutput>
  </Content>
</ItemGroup>

第二步:主项目可选配置

绝大多数场景下主项目无需额外修改,引入新打包的版本即可自动同步Drivers目录到输出目录。如果仍然无法复制,可在主项目的PackageReference节点添加配置:

<PackageReference Include="Drivers.Framework" Version="1.0.9"> <!-- 替换为你新打的版本号 -->
  <IncludeContentFiles>true</IncludeContentFiles>
</PackageReference>

如果是ASP.NET Core/Blazor项目,还可在主项目PropertyGroup中添加:

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

第三步:路径调用代码

此时exe已经和主程序输出在同个根目录下,直接用路径拼接即可:

var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Drivers");

方案2:直接调用Nuget缓存中的exe(无需复制到主项目输出)

无需修改类库打包配置,直接修改类库中获取路径的代码,正确获取当前类库程序集所在的Nuget缓存路径:

using System.Reflection;
using System.IO;

// 获取当前类库的程序集实例
var currentAssembly = Assembly.GetExecutingAssembly();
// 解析程序集的实际物理路径
var assemblyPath = new Uri(currentAssembly.CodeBase).LocalPath;
// 类库dll所在的目录,对应Nuget缓存中的lib/net5.0路径
var assemblyDir = Path.GetDirectoryName(assemblyPath);
// 拼接得到Drivers目录路径
var driverDir = Path.Combine(assemblyDir, "Drivers");

该方案的优势是不会在主项目输出目录产生额外的exe文件,缺点是如果主项目开启了程序集影子复制(如部分单元测试框架、旧版ASP.NET)会导致路径读取失效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:24:01