【发布时间】:2016-05-12 19:00:59
【问题描述】:
我制作了一个依赖于 CefSharp 的库,它需要为特定平台构建库。所以没有 AnyCPU 支持。
现在我想将它打包到 NuGet 中。据我了解,您必须将这些文件放入 build 文件夹并拥有一个 .targets 文件,该文件可以选择正确的 dll 进行引用。所以我最终得到了一个如下所示的 NuGet 包:
lib
monodroid
MyLib.dll
xamarin.ios10
MyLib.dll
net45
MyLib.dll (x86)
build
net45
x86
MyLib.dll (x86)
x64
MyLib.dll (x64)
MyLib.targets
我将以下内容放入.targets 文件中:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="PlatformCheck" BeforeTargets="InjectReference"
Condition="(('$(Platform)' != 'x86') AND ('$(Platform)' != 'x64'))">
<Error Text="$(MSBuildThisFileName) does not work correctly on '$(Platform)' platform. You need to specify platform (x86 or x64)." />
</Target>
<Target Name="InjectReference" BeforeTargets="ResolveAssemblyReferences">
<ItemGroup Condition="'$(Platform)' == 'x86' or '$(Platform)' == 'x64'">
<Reference Include="MyLib">
<HintPath>$(MSBuildThisFileDirectory)$(Platform)\MyLib.dll</HintPath>
</Reference>
</ItemGroup>
</Target>
</Project>
到目前为止一切顺利。现在来解决问题。将此 NuGet 添加到新的 WPF 项目时,我看到 .csproj 文件中出现了对该库的引用,例如:
<Reference Include="MyLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d64412599724c860, processorArchitecture=x86">
<HintPath>..\packages\MyLib.0.0.1\lib\net45\MyLib.dll</HintPath>
<Private>True</Private>
</Reference>
虽然我没有看到关于.targets 文件的任何内容。这仍然是使用 NuGet 3 的方法吗?我做错什么了吗?目前,由于对 x86 库的引用,这在运行 x64 时会在运行时失败。
【问题讨论】:
-
如果您不需要支持使用 project.json 的较新的 Windows 10 项目,我会尝试删除 lib\Net45 目录。 NuGet 应安装到 WPF 项目中,只需将 .targets 文件导入项目文件 (.csproj)。
-
我不打算支持 UWP 或任何使用新 project.json 内容的新项目。明天再试一次。但是,在添加了 nuget 的 csproj 文件中没有看到引用的目标仍然很困惑。
-
我尝试删除 lib\net45 文件夹,但它什么也没做,只是因为找不到 dll 而使它无法构建。
-
在 Windows 和 Mac 上都可以正常工作。我使用您的 MSBuild 目标创建了一个简单的示例 NuGet package。我可以在 C# 项目中使用它并使用 x86 和 x64 构建它,并引用适当的 .dll。
-
我在这里关注了问题和 cmets,我的 csproj 引用了目标文件并且构建工作正常,但是我添加的 DLL 没有出现在 VS (2015) 参考中.他们应该吗?谢谢
标签: nuget msbuild-target