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

时间:2019-05-24 14:04:42

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

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

我已经尝试创建NuGet程序包,但是由于依赖项看起来像他们正在尝试在.NET框架上加载程序包一样,我会收到警告。唯一真正的解决方法是建立一个.NET类库之类的东西,然后通过它引用dll,并使用该库创建一个NuGet包,然后仅将旧dll添加为引用?

2 个答案:

答案 0 :(得分:0)

  

我可以使用不在.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以获得一些详细信息。

enter image description here

希望这会有所帮助。

答案 1 :(得分:0)

我假设您的意思是您的托管代码使用DllImport属性来调用本机代码,在.NET生态系统中,本机代码称为平台调用或P / Invoke。我之所以这样说是因为,如果您用Google搜索P / Invoke和nuget的术语,那么可能会更幸运地发现existint堆栈溢出问题,博客文章等。因此,尝试找出您使用的功能的正式名称或常用名称非常有用,这样您便知道要搜索的内容。不幸的是,我认为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(或者如果不再使用,则在较早版本中也是如此)。我目前正在休假,所以没有动力去深入自己。