Nuget类库包含的.exe文件引入主项目后未出现在输出目录求助
问题根因
你当前的配置存在两个核心问题:
- Nuget默认仅会处理
contentFiles目录下的内容文件,自动复制到引用项目的输出目录,你将exe放在lib目录下,不属于Nuget约定的自动复制内容范围 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
相关产品推荐
相关产品推荐

