我有一个使用非.NET DLL的.NET DLL。我试图用这个创建一个NuGet包,但我似乎没有透过它背后的魔力。我阅读了关于<files>
和<references>
的NuGet参考,但这对我来说并不合适 - VS继续拒绝安装软件包,理由是“......无法添加引用NonNETLib1" 。我尝试了一个不同的变体,其中非.NET库与net40
文件夹中的.NET库以及没有<files>
部分的nusepc文件捆绑在一起,但在这种情况下即使安装了包,OK,代码在运行时抛出异常,因为它无法找到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,但是接受的答案并没有多大帮助。
答案 0 :(得分:2)
即使程序包安装好了,代码在运行时抛出异常,因为它找不到DLL
在项目中添加对.Net DLL的引用时,它会自动复制到输出文件夹。但由于您的DLL不是.Net,因此您无法直接在项目中添加对它的引用,因此根本不会复制它。
我会在你的项目中添加一个预构建或后构建步骤,比如xcopy /y /f "$(ProjectDir)..\packages\NonNet.dll" "$(TargetDir)"
,但我怀疑有更好更清洁的方法。
在任何情况下,它都不是与nuget相关的问题,而是更常见的Visual Studio项目问题。
似乎共识是将原生DLL添加为项目的现有项目(作为链接),如果更新则将其设置为内容/副本:Are there any better ways to copy a native dll to the bin folder?
答案 1 :(得分:0)
有一个基于PowerShell的工具集,用于打包NuGet使用的本机代码。它主要处理有关集成到本机项目的问题,但它应该提供将本机dll插入.NET项目所需的工具。
http://coapp.org/news/2013-04-26-Announcing-CoApp-Tools-For-NuGet.html
答案 2 :(得分:0)
我有完全相同的问题,我用nuget 3.3为我找到了一个很好的解决方案。这样只会将.net-lib引用到项目中,而non.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>