【问题标题】:Can I create a NuGet package (or other package) with legacy dll's that are not on a .NET Framework?我可以使用不在 .NET Framework 上的旧版 dll 创建 NuGet 包(或其他包)吗?
【发布时间】:2019-05-24 14:04:42
【问题描述】:

我们有一堆旧版 dll(基本上可以是任何东西,有些是旧的 fortran,有些是 .NET),我们希望将它们移至 Azure Artifacts。我可以自己从这些不基于 .NET(如 Fortran 的)的旧版 dll 中创建 NuGet 包吗?

我已经尝试过创建 NuGet 包,但是我收到了关于我的依赖项的警告,因为看起来他们正试图在 .NET 框架上加载包。这里唯一真正的解决方法是构建一个 .NET 类库或其他东西,然后通过它引用 dll,并使用该库创建一个 NuGet 包,然后将旧版 dll 作为引用添加?

【问题讨论】:

  • 你如何想象你的包的用户使用它?假设您在一个包中打包了一些 fortran 代码或 dll 或其他任何内容,谁将使用该包?另一个fortran用户?他们将如何获得它?构建系统如何知道将包的内容作为构建的一部分包含在内?一旦这些问题得到解答,知道如何打包就变得容易了,或者至少更容易了。
  • 我们只是想将包用作 dll 的存储,不需要像传统的 nuget 包那样从代码中引用 dll,实际的 dll 只需要在正确的位置,所以它被我们的 .net 代码使用,但不是实际的依赖项

标签: nuget nuget-package azure-artifacts nuget-package-explorer


【解决方案1】:

我可以使用不在 .NET Framework 上的旧版 dll 创建 NuGet 包(或其他包)吗?

答案是肯定的。

您可以将这些旧版 dll 定位到 tools 文件夹而不是 lib 文件夹。喜欢:

<files>
    <file src="legacy\*.dll" target="Tools" />
    <!-- Other files -->
</files>

然后在构建管道时打包这个.nuspec文件,那些遗留的dll位于tools文件夹中,不会添加为引用。

查看From a convention-based working directory 了解一些详细信息。

希望这会有所帮助。

【讨论】:

  • 好吧,我猜还有一个问题,如果我们想将这些存储起来供人们在本地下载,比如说在他们克隆 repo 时安装 nuget 包,如果它会将 dll 放在 nuget 包中它们在工具文件夹中吗?
  • @biggfu444,在解决方案文件夹的\packages 文件夹中。然后,您可以在需要时手动添加这些 dll。
  • 好的,所以我们的代码被编写为基本上期望 dll 位于我们项目的 exe 运行所在的同一文件夹中,所以我不希望我们的开发人员必须移动 dll当他们想手动测试时,我们只希望他们在正确的文件夹中,我觉得在管道中我可以编辑 NuGet 还原步骤以指向正确的路径,但不确定本地。
  • @biggfu444,如果您不希望我们的开发人员在测试时必须手动移动 dll,您需要在您的 nuget 包中设置一个任务,将这些 dll 文件复制到项目的exe运行所在的同一文件夹,请查看我的另一个线程以获取详细信息:stackoverflow.com/questions/44747744/…
【解决方案2】:

我假设您的意思是您的托管代码使用 DllImport 属性来调用本机代码,在 .NET 生态系统中称为平台调用或 P/Invoke。我之所以提到这一点,是因为如果您在 P/Invoke 和 nuget 周围搜索术语,您可能会更幸运地找到存在的堆栈溢出问题、博客文章等。出于这个原因,尝试找出您使用的功能的官方名称或常用名称很有用,这样您就知道要搜索什么。不幸的是,我认为 NuGet 团队目前没有关于这种情况的任何文档。

SDK 风格的项目支持包中的runtime\ 目录,尽管我认为这也有点无证。我不知道使用PackageReference(PR)的传统项目,但packages.config(PC)肯定不支持runtimes\。对于 PC 项目,包作者通常(总是?)包含 build targets 以在构建后复制本机程序集。在包中,本机 dll 在别处,通常作者将它们放在目标旁边的build 目录中,但我想我也看到了目标从runtime 目录复制,因此该包同时支持 PC和 SDK 风格的项目。

我建议您尝试考虑一些常用的具有 .NET 绑定的本机库,并查看该包的工作原理(nupkg 只是一个 zip 重命名)。我的猜测是 sqlite 或 curl,或者 asp.net core 的 kestrel web 服务器如何捆绑 libuv(或者如果不再这样做,则在早期版本中捆绑)。我现在正在度假,所以没有动力自己去深挖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    相关资源
    最近更新 更多