C# 如何确定NuGet包中二进制文件的行为

C# 如何确定NuGet包中二进制文件的行为,c#,mef,nuget-package,C#,Mef,Nuget Package,我正在研究一个大的解决方案,我把很多项目都变成了NuGet包。这些包是在VS的单独解决方案中通过.nuproj文件创建的 除以下情况外,一切正常: 在bootstrap中,我加载了一些目录,以便MEF能够导入它们,这在我处理原始项目时非常有效,但现在所需的DLL(来自a包)无法放入bin\Debug\Modules文件夹 有没有办法让NuGet将其内容复制到Modules文件夹?(而不是根路径) 我尝试使用包中不同类型的子文件夹,但没有成功 您应该能够使用内容/模块的目标。content目录中的

我正在研究一个大的解决方案,我把很多项目都变成了NuGet包。这些包是在VS的单独解决方案中通过.nuproj文件创建的

除以下情况外,一切正常: 在bootstrap中,我加载了一些目录,以便MEF能够导入它们,这在我处理原始项目时非常有效,但现在所需的DLL(来自a包)无法放入bin\Debug\Modules文件夹

有没有办法让NuGet将其内容复制到Modules文件夹?(而不是根路径)


我尝试使用包中不同类型的子文件夹,但没有成功

您应该能够使用
内容/模块的目标。
content
目录中的任何内容都会在生成时复制到
bin
目录中

如果您试图使用特殊的“基于约定”文件夹,如
lib/net45
,则这些目录会导致Visual Studio在安装包时自动创建程序集引用。您不应该将这些用于常规内容文件


有关更多详细信息,请参阅。

我发现解决此问题的最佳方案如下:

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="CopyToOutput" AfterTargets="Build">
    <ItemGroup>
      <FilesToCopy Include="$(MSBuildThisFileDirectory)..\content\**\*.*"/>    
    </ItemGroup>
    <Copy 
      SourceFiles="@(FilesToCopy)" 
      DestinationFiles="@(FilesToCopy->'$(OutDir)/%(RecursiveDir)%(FileName)%(Extension)')"/>
  </Target>
</Project>
将需要加载的文件放入内容文件夹。这可以简单地做到:

<ItemGroup>
    <Content Include=" {here go the needed files} " />
</ItemGroup>

内容文件夹仅保存文件,但它不会将文件复制到客户端项目的输出文件夹中。为了将它们复制到所需的输出,可以使用.targets文件,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="CopyToOutput" AfterTargets="Build">
    <ItemGroup>
      <FilesToCopy Include="$(MSBuildThisFileDirectory)..\content\**\*.*"/>    
    </ItemGroup>
    <Copy 
      SourceFiles="@(FilesToCopy)" 
      DestinationFiles="@(FilesToCopy->'$(OutDir)/%(RecursiveDir)%(FileName)%(Extension)')"/>
  </Target>
</Project>

请记住,要将目标文件添加到项目中,目标文件名和NuGet的ID必须相等。