我们有一堆由另一家公司提供的托管库和本地库。我们同时拥有x86和x64版本。为了在ASP.NET Core项目中使用它们,我必须创建一个Nuget包。
我的架构如下:
- 一个ASP.NET Core类库,我将其更改为仅针对完整的.NET Framework。此项目引用了我的Nuget包。 - 一个ASP.NET Core网站,也针对完整的.NET Framework,并引用类库。
当然,最终我需要将本地库提取到网站的正确运行时文件夹中(例如:\bin\Debug\net461\win7-x64)。
目前我的解决方案是:
- 将本地库放在
build
文件夹中 - 创建一个
targets
文件,将它们复制到$(OutputPath)
(甚至不是运行时文件夹) - 在我的网站的
xproj
中添加一些MsBuild命令,以获取目标文件在$(USERPROFILE)\.nuget\packages\
文件夹中并执行它 - 现在手动将从
bin
文件夹中提取的本机DLL复制到runtime
中
我曾尝试直接使用project.json
中的一些配置将它们直接复制到运行时文件夹中(我真的不记得我为这部分尝试了所有的事情),但这总是失败的。此外,即使我在我的目标文件中指定了SkipUnchangedFiles="true"
,这也被忽略了,我的DLL在每次构建时都会被复制到我的bin文件夹中。
这是一个繁重的过程,只为实现DLL提取,现在我真的想摆脱所有的MsBuild,并获得一个更简单的解决方案。
我知道在新版Nuget中,它现在能够原生地提取它们,无需添加自定义的MsBuild命令。如此处所述,C#项目甚至不需要targets
文件。
我在浏览器中保留了一个选项卡几个月(原始链接),并意识到这个资源最近已从Nuget网站中删除。它解释了如何使用接下来,可能会使用您的NuGet软件包的C++和JavaScript项目需要一个.targets文件来识别必要的程序集和winmd文件。(C#和Visual Basic项目会自动完成此操作。)
runtimes
文件夹来自动提取本机DLL。然而,我从未能够按照其所述获得成功结果。现在,这个页面已被删除,并由这个页面替换,其中解释很少,根本不涉及runtimes
文件夹。我猜应该使用
runtimes
文件夹来存放本机DLL,而使用lib
文件夹来存放托管代码,但我不能百分之百确定。(那么我应该使用build
文件夹吗?)我尝试了几种方法(我记不清尝试了多少次,就像我说的,头痛了几个月...),比如这个架构(我不明白为什么要在
runtimes
下有build/native
和natives文件夹) ![enter image description here](https://istack.dev59.com/M5Iny.webp)
编译器在创建程序集引用时会忽略架构,这是一个加载时间的概念。如果存在特定架构的引用,加载器将优先选择它。您可以使用corflags从x86程序集中删除架构来生成AnyCPU程序集,例如:corflags /32BITREQ- MySDK.dll。Corflags是.NET SDK的一部分,可以在VS的开发人员命令提示符中找到。
我已经将x86和x64 DLL都转换为AnyCPU(不知道是否对x64 DLL有影响,但我没有收到错误信息),然后尝试了Nuget包中的多种不同架构,但仍然无法正常工作。默认的运行时没有在project.json中指定任何条目,是win7-x64,所以我决定明确指定它以防万一。
"runtimes": {
"win7-x64": {}
},
这是我在Nuget包中使用的运行时标识符,但我不关心Windows版本。实际上,我更喜欢win-x86或win-x64,但根据this page,它似乎是无效的值。
Windows RIDs
Windows 7 / Windows Server 2008 R2
- win7-x64
- win7-x86
Windows 8 / Windows Server 2012
- win8-x64
- win8-x86
- win8-arm
Windows 8.1 / Windows Server 2012 R2
- win81-x64
- win81-x86
- win81-arm
Windows 10 / Windows Server 2016
- win10-x64
- win10-x86
- win10-arm
- win10-arm64
然而,Github源代码中描述了更多的RID,所以哪个源是正确的?
正如您所看到的,这里有很多的谜团,主要是因为缺乏文档或不同文档之间的矛盾。
如果我至少能有一个工作示例,那么我就可以执行我的测试来回答其他问题,比如尝试使用通用的win-x64
RID,或者查看是否可以包含我的托管库,无论.NET Framework版本如何。
请注意我的特殊上下文:我有一个针对完整.NET Framework的ASP.NET Core项目
感谢您的答案,我渴望让这个简单的东西工作。
$/runtimes/{runtime-id}/native
结构。 - Jérôme MEVEL