如何使用MSBuild更改嵌入式资源的默认命名空间?

时间:2012-05-23 06:09:36

标签: visual-studio-2010 msbuild embedded-resource

我试图在我的控制台项目中嵌入一个非托管的dll。项目的默认名称空间为Company.Project1Exe。程序集名称(输出exe)名为project1.exe

使用Add as Link选项将dll添加到项目中,并位于Libs\x86子文件夹

Company.Project1Exe
   |
   |--Program.cs
   |--Libs
       |--x86
           |-My1st.dll
           |-My2nd.dll  

它们已使用Add as Link选项添加到项目中,因此未实际位于Libs子文件夹中。

我已将这两个dll的Build Action设置为'Embedded Resource'。

默认情况下,MSBuild将使用DefaultNamspace.ExtendedNamespace.FileName嵌入这些dll,其中ExtendedNamespace表示项目的目录结构。

这会导致资源分别嵌入Company.Project1.Libs.x86.My1st.dllCompany.Project1.Libs.x86.My2nd.dll

我希望使用程序集名称嵌入这些资源,以便它们分别嵌入Project1.Libs.x86.My1st.dllProject1.Libs.x86.My2nd.dll

我该怎么做?

1 个答案:

答案 0 :(得分:12)

可以解决此问题的一种方法是设置嵌入资源的LogicalName。默认情况下,当您嵌入资源时,您会在csproj文件中找到类似于

的条目
<EmbeddedResource Include="path to embdedded resource"/>

对于使用Add as Link添加的资源,您会发现其他Link属性。在这种情况下,Link属性是资源相对于项目结构的路径,Include属性是指向文件在计算机上的位置(相对于项目)。

<EmbeddedResource Include="path to embdedded resource"/>
  <Link>Libs\x86\My1st.dll</Link>
</EmbeddedResource>

为了使用不同的命名空间嵌入程序集,可以将LogicalName属性添加到上面,允许用户覆盖默认的msbuild行为。

<EmbeddedResource Include="path to embdedded resource"/>
  <Link>Libs\x86\My1st.dll</Link>
  <LogicalName>$(TargetName).Libs.x86.My1st.dll</LogicalName>
</EmbeddedResource>

它看起来的缺点是,每个添加的资源都需要这样做。但是,我希望以某种方式设置此约定,以便这可以是在我的项目中嵌入任何资源的默认方式,即使用$(TargetName)替换默认命名空间