尝试将非 .NET 库添加到 NuGet 包
Trying to add non-.NET libraries to NuGet package
我有一个使用非 .NET DLL 的 .NET DLL。我正在尝试从中创建一个 NuGet 包,但我似乎并没有深入了解这背后的魔力。我阅读了有关 <files>
和 <references>
的 NuGet 参考资料,但这对我来说并没有真正解决 - VS 一直拒绝安装包,理由是“......未能添加对非 NETLib1”。我尝试了一种不同的变体,其中非 .NET 库与 net40
文件夹中的 .NET 库以及没有 <files>
部分的 nusepc 文件捆绑在一起,但在这种情况下,即使包安装正常,代码在运行时抛出异常,因为它找不到 DLL。
这是我的 .nuspec:
<?xml version="1.0"?>
<package >
<metadata>
<id>PackageName</id>
<version>1.0.3</version>
<authors>me</authors>
<owners>some guys</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>description</description>
<references>
<reference file="NonNETLib1.dll" />
<reference file="NonNETLib2.dll" />
<reference file="NonNETLib3.dll" />
</references>
</metadata>
<files>
<file src="lib\NonNETLib1.dll" />
<file src="lib\NonNETLib2.dll" />
<file src="lib\NonNETLib3.dll" />
</files>
</package>
文件夹结构如下:
[lib]
\- NonNETLib1.dll
\- NonNETLib2.dll
\- NonNETLib3.dll
\- [net40]
\- Net40Lib.dll
我在这里错过了什么?
P.S。我知道这有点相似 to this question,但公认的答案并没有多大帮助。
even though the package installed OK, the code threw an exception in runtime, because it could not find the DLLs
当您在项目中添加对 .Net DLL 的引用时,它会自动复制到输出文件夹。但是由于你的DLL不是.Net,所以你不能直接在项目中添加对它的引用,所以根本没有复制。
我会在您的项目中添加预构建或 post-构建步骤,例如 xcopy /y /f "$(ProjectDir)..\packages\NonNet.dll" "$(TargetDir)"
,但我怀疑有更好更简洁的方法来完成它。
无论如何,这不是与 nuget 相关的问题,而是更普遍的 Visual Studio 项目问题。
更新
似乎共识是将本机 DLL 作为现有项(作为 link)添加到项目中,如果较新,则将其设置为 content/copy:Are there any better ways to copy a native dll to the bin folder?
有一个基于 powershell 的工具集,用于打包本机代码以供 NuGet 使用。它主要处理与集成到本机项目有关的问题,但它也应该提供将本机 dll 插入 .NET 项目所需的工具。
http://coapp.org/news/2013-04-26-Announcing-CoApp-Tools-For-NuGet.html
我遇到了完全相同的问题,我用 nuget 3.3 找到了一个很好的解决方案。这样只有 .net-lib 将被引用到项目中,非 .Net lib 只会被复制到 bin 文件夹中。
<references>
<reference file="Net.dll">
<references>
<files>
<file src="..\bin\NonNet.dll" target="lib/452">
<file src="..\bin\Net.dll" target="lib/452">
<files>
我有一个使用非 .NET DLL 的 .NET DLL。我正在尝试从中创建一个 NuGet 包,但我似乎并没有深入了解这背后的魔力。我阅读了有关 <files>
和 <references>
的 NuGet 参考资料,但这对我来说并没有真正解决 - VS 一直拒绝安装包,理由是“......未能添加对非 NETLib1”。我尝试了一种不同的变体,其中非 .NET 库与 net40
文件夹中的 .NET 库以及没有 <files>
部分的 nusepc 文件捆绑在一起,但在这种情况下,即使包安装正常,代码在运行时抛出异常,因为它找不到 DLL。
这是我的 .nuspec:
<?xml version="1.0"?>
<package >
<metadata>
<id>PackageName</id>
<version>1.0.3</version>
<authors>me</authors>
<owners>some guys</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>description</description>
<references>
<reference file="NonNETLib1.dll" />
<reference file="NonNETLib2.dll" />
<reference file="NonNETLib3.dll" />
</references>
</metadata>
<files>
<file src="lib\NonNETLib1.dll" />
<file src="lib\NonNETLib2.dll" />
<file src="lib\NonNETLib3.dll" />
</files>
</package>
文件夹结构如下:
[lib]
\- NonNETLib1.dll
\- NonNETLib2.dll
\- NonNETLib3.dll
\- [net40]
\- Net40Lib.dll
我在这里错过了什么?
P.S。我知道这有点相似 to this question,但公认的答案并没有多大帮助。
even though the package installed OK, the code threw an exception in runtime, because it could not find the DLLs
当您在项目中添加对 .Net DLL 的引用时,它会自动复制到输出文件夹。但是由于你的DLL不是.Net,所以你不能直接在项目中添加对它的引用,所以根本没有复制。
我会在您的项目中添加预构建或 post-构建步骤,例如 xcopy /y /f "$(ProjectDir)..\packages\NonNet.dll" "$(TargetDir)"
,但我怀疑有更好更简洁的方法来完成它。
无论如何,这不是与 nuget 相关的问题,而是更普遍的 Visual Studio 项目问题。
更新
似乎共识是将本机 DLL 作为现有项(作为 link)添加到项目中,如果较新,则将其设置为 content/copy:Are there any better ways to copy a native dll to the bin folder?
有一个基于 powershell 的工具集,用于打包本机代码以供 NuGet 使用。它主要处理与集成到本机项目有关的问题,但它也应该提供将本机 dll 插入 .NET 项目所需的工具。
http://coapp.org/news/2013-04-26-Announcing-CoApp-Tools-For-NuGet.html
我遇到了完全相同的问题,我用 nuget 3.3 找到了一个很好的解决方案。这样只有 .net-lib 将被引用到项目中,非 .Net lib 只会被复制到 bin 文件夹中。
<references>
<reference file="Net.dll">
<references>
<files>
<file src="..\bin\NonNet.dll" target="lib/452">
<file src="..\bin\Net.dll" target="lib/452">
<files>