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

Ahm*_*mad 8 msbuild visual-studio-2010 embedded-resource

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

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

Company.Project1Exe
   |
   |--Program.cs
   |--Libs
       |--x86
           |-My1st.dll
           |-My2nd.dll  
Run Code Online (Sandbox Code Playgroud)

它们已使用该Add as Link选项添加到项目中,因此不会物理定位到Libs子文件夹中.

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

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

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

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

我怎样才能做到这一点?

Ahm*_*mad 12

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

<EmbeddedResource Include="path to embdedded resource"/>
Run Code Online (Sandbox Code Playgroud)

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

<EmbeddedResource Include="path to embdedded resource"/>
  <Link>Libs\x86\My1st.dll</Link>
</EmbeddedResource>
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 您认为在选择文件时应该能够从"属性"选项卡更新LogicalName,但事实并非如此.相反,必须直接编辑项目文件. (3认同)