【问题标题】:Get path of file located in NuGet package's directory from same package in C#从 C# 中的同一包获取位于 NuGet 包目录中的文件路径
【发布时间】:2019-10-10 12:19:05
【问题描述】:

我有一个引用 NuGet 包的.NET Framework (4.7) 解决方案。此 NuGet 包应从 htmlxml 文件中读取。这些文件都位于包的文件夹(NuGet 包)中,解决方案不需要它们,而只有 NuGet 包本身需要它们。

在运行使用上述 NuGet 包的解决方案时,如何引用这些文件?

我尝试使用./,但这只是指向我的解决方案的根目录。

我正在尝试的实际调用是:File.ReadAllText(path)

我还尝试将文件的Copy to Output Directory 属性设置为Copy always,并将Build Action 用作Content。例如,这是在packages/<package name>/Content/*.html 中复制这些文件,不知何故我想我可以得到这个路径,比如这里给出的解决方案:Getting the path of a nuget package programmatically

但是对于这样一个看似简单的任务,这对我来说似乎很复杂。这样做的干净方法是什么?

编辑:重命名问题以指定在这种情况下设置资源不是一个选项,因为我在 NuGet 包中使用的某些功能正在请求文件路径而不是资源。

【问题讨论】:

  • 这是控制台应用还是网络应用? .NET 核心? .NET 框架?
  • 抱歉,忘了说它是一个 .NET Framework 解决方案。

标签: c# nuget .net-assembly filepath


【解决方案1】:

如果这是您创建的 nuget 包,则在运行时的任何情况下都不应使用外部文件!有人可以更改它,如果需要,请将其添加为 embedded resource

无论如何,在运行时我会得到 .dll 所在的文件夹,如下所示:

 var currentAssemblyName = Assembly.GetExecutingAssembly().GetName().Name;
 var rootFolder = Assembly.GetExecutingAssembly().Location.Split(currentAssemblyName)[0];

编辑 - 应该适用于 .NET Framework 或 dotnet core

我的错误,要获得 DLL 的真实路径,您需要搜索程序集,因为 ExecutingAssembly 来自 .exe 的启动位置

 var assembly = AppDomain.CurrentDomain
                          .GetAssemblies()
                          .SingleOrDefault(assembly => assembly.GetName().Name == "my.awsome.nuget");
 var location = assembly.Location; 

【讨论】:

  • 你也可以在包的程序集中放置一个辅助函数,然后使用Assembly.GetCurrentAssembly()。但到目前为止,与使用嵌入式资源相比,优势几乎为零。
  • 使用Path.GetDirectoryName(assembly.Location) 是使用程序集获取目录而不是使用拆分的一种可能更简单的方法
  • GetExecutingAssemblyGetCurrentAssemblyAppDomain.CurrentDomain.GetAssemblies 都为我返回了解决方案的调试文件夹路径。获取资源对我来说不是一种选择,因为我有将路径作为参数而不是资源的函数。
  • 是的,nugget 所在的地方,如果你发布你的应用程序,nugget .dll 在 publish 文件夹下,那么有什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多